无法在具有大堆大小的64位Windows 7中运行64位JVM

Qua*_*nic 10 java windows 64-bit memory-management

这是64位Windows 7 Enterprise和64位Java 7:

java version "1.7.0_04"
Java(TM) SE Runtime Environment (build 1.7.0_04-b20)
Java HotSpot(TM) 64-Bit Server VM (build 23.0-b21, mixed mode)
Run Code Online (Sandbox Code Playgroud)

这种情况同时使用的外壳C:\Windows\SystemWOW64\cmd.exe(我认为不正确的是64位版本),并C:\Windows\System32\cmd.exe(我刚刚发现,脉冲星的礼貌,是尽管路径名称的64位应用程序).

该计划本身是微不足道的:

public class Trivial
{
    public static void main(String[] args) {
        System.out.println("total = " + toMB(Runtime.getRuntime().totalMemory()));
        System.out.println("max   = " + toMB(Runtime.getRuntime().maxMemory()));
    }

    private static long toMB(long bytes) {
        return bytes / (1024L * 1024L);
    }
}
Run Code Online (Sandbox Code Playgroud)

我只是打打闹闹不同-Xmx-Xms参数,看看会发生什么.虽然我在64位Windows上使用64位Java,但我可以使用几乎所有大小和我想要的初始堆,但这不是正在发生的事情.

java -Xmx16G -Xms2G Trivial(例如)工作正常.但是,java -Xmx16G -Xms4G Trivial给我:

Error occurred during initialization of VM
Could not reserve enough space for object heap
Run Code Online (Sandbox Code Playgroud)

Weirder(对我而言)java -Xmx16G -Xms3G Trivial给出了一个不同的错误:

Error occurred during initialization of VM
Unable to allocate tables for parallel garbage collection for the requested heap size.
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
Run Code Online (Sandbox Code Playgroud)

试图分裂之间的差异2G,并3G看看是否有地方发生这种情况我想一个特定的大小java -Xmx16G -Xms2900M Trivial和它的工作.然后我尝试了-Xms2960M它的工作原理.随着-Xms2970mJVM崩溃:

#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (malloc) failed to allocate 1048576 bytes for E in C:\jdk7u2_64p\jdk7u4\hotspot\src\share\vm\utilities/taskqueue.hpp
# An error report file with more information is saved as:
# C:\Users\QuantumMechanic\Temp\hs_err_pid10780.log
Run Code Online (Sandbox Code Playgroud)

这种情况一直持续到-Xms2995M它切换回"无法为并行垃圾收集分配表"消息并且-Xms随着进一步增加而坚持下去.

会发生什么事?从cmd.exe(甚至是64位)启动某些东西会产生一些进程大小限制吗?Windows(或JVM)需要一个巨大的内存块吗?(但那为什么不同的消息)?别的什么?

Mat*_*der 5

SysWoW64指的是32位Windows on Windows 64.简化:32位Windows在Windows 64bit上运行).

因此,您明确要求在32位cmd shell中运行.

请参阅:

http://en.wikipedia.org/wiki/WoW64


bil*_*.cn 4

在64位系统中,你有2^63Bytes的用户地址空间,但你仍然只能映射你拥有的实际内存量(物理+页面文件+映射文件)。

当 JVM 创建堆时,它使用 Cmalloc()来请求初始内存块,然后它将自行管理该。即使堆上根本没有任何对象,操作系统也会使用该块。

由于您指定了-Xms内存池的最小值,JVM 将尝试从操作系统请求该内存量,否则会失败,因为它无法满足您的命令。

我想如果你想看看 64 位 Java 的优势。也许您可以尝试打开一个大于 4GB 的文件进行随机访问,并将其映射到 MappedByteBuffer。

  • 它**是**交换大小。由于某种原因,我使用的计算机上的页面文件不是自动管理的,而是设置为 4GB 的恒定大小。计算机的 RAM 为 8GB,因此最多有 12GB 的虚拟内存,当然还有一大堆其他程序在运行。当我增加页面文件大小时,我能够获得更高的“-Xms”值。 (3认同)