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)需要一个巨大的内存块吗?(但那为什么不同的消息)?别的什么?
SysWoW64指的是32位Windows on Windows 64.简化:32位Windows在Windows 64bit上运行).
因此,您明确要求在32位cmd shell中运行.
请参阅:
http://en.wikipedia.org/wiki/WoW64
在64位系统中,你有2^63Bytes的用户地址空间,但你仍然只能映射你拥有的实际内存量(物理+页面文件+映射文件)。
当 JVM 创建堆时,它使用 Cmalloc()来请求初始内存块,然后它将自行管理该块。即使堆上根本没有任何对象,操作系统也会使用该块。
由于您指定了-Xms内存池的最小值,JVM 将尝试从操作系统请求该内存量,否则会失败,因为它无法满足您的命令。
我想如果你想看看 64 位 Java 的优势。也许您可以尝试打开一个大于 4GB 的文件进行随机访问,并将其映射到 MappedByteBuffer。