Java堆空间和RAM

Java堆空间和RAM,java,jvm,heap,heap-memory,jvm-hotspot,Java,Jvm,Heap,Heap Memory,Jvm Hotspot,读了一篇关于分析线程转储的文章后,我有一个问题困扰着我。有一段提到32位JVM中的逻辑最大堆大小是4GB link指出,32位Windows计算机上的最大堆大小约为1.4-1.6 GB 我的问题是,假设你有8GB左右的RAM,这是否意味着如果我是32位JVM,我只能利用1.4-1.6GB的内存?64位JVM允许的最大大小是多少 感谢您对此的帮助,因为我同样感到困惑。jvm和操作系统也使用分页内存管理系统,为我们在中获得4G虚拟内存 32位操作系统 但是,如果您有8G ram,则必须使用64位版本

读了一篇关于分析线程转储的文章后,我有一个问题困扰着我。有一段提到32位JVM中的逻辑最大堆大小是4GB

link指出,32位Windows计算机上的最大堆大小约为1.4-1.6 GB

我的问题是,假设你有8GB左右的RAM,这是否意味着如果我是32位JVM,我只能利用1.4-1.6GB的内存?64位JVM允许的最大大小是多少


感谢您对此的帮助,因为我同样感到困惑。

jvm和操作系统也使用分页内存管理系统,为我们在中获得4G虚拟内存

32位操作系统


但是,如果您有8G ram,则必须使用64位版本的操作系统才能获得最高的操作系统性能。这取决于您的操作系统,32位版本的MacOS X和Linux在内核中可以访问超过4GB的内存,但仍将进程限制为4GB。其他操作系统可能会进一步限制进程内存,因为它们自己需要4GB的一部分。通常,您希望避免将JVM交换到VM,因此您需要知道系统有多少可用内存。

2^32=4GB是32位可寻址的最大总内存

JVM在32位机器上只能获得1.4-1.6GB,因为您仍然需要适应操作系统


2^64=(2^32)^2是可以用64位寻址的最大总内存。正如您所看到的,这是一个更大的数字。

特别是在windows上,原因是hotspot(sun/oracle JVM)和windows DLL的实现相结合

32位代码可以访问4GB虚拟地址空间(有一些扩展允许更多,但我不打算讨论这些扩展)

在32位windows上,此虚拟地址空间的上2GB保留供操作系统使用(某些版本的操作系统接受该标志作为引导参数,以允许3GB的用户可访问空间)

此外,您使用的任何库(*.dll)都会映射到此地址空间的一部分。默认情况下,windows base*.dll文件以~1.6 GB标记加载(操作系统版本和修补程序级别略有不同)

最重要的是,hotspot JVM只支持分配单个、连续的内存块作为堆空间

因此,如果你试着在脑海中想象一下,你会发现你有一个约2GB的空闲区域,其中有一个“墙”窗口*.dll,加载速度约为1.6GB。这就是这个数字背后的逻辑。这也意味着,即使您提供/3GB标志,sun/oracle JVM也无法使用它。其他一些VM更擅长处理碎片堆,比如

您也可以尝试将它们加载到更高的内存地址,并压缩一些更可用的堆空间,但这个过程是脆弱的

还要注意的是,加载到特定机器上的驱动程序/应用程序(如防病毒软件)很可能会将自己的*.dll注入java进程,并且这些dll可以以更低的内存地址加载,从而进一步缩小可用堆空间


在64位版本的windows上,物理限制目前为64TB

32位机器的最大可寻址内存=2^32=4294967296=~4 GB。您需要为您的操作系统、运行的其他应用程序的页面等留出空间。是的,它确实需要空间,对于64位JVM来说,限制非常大,可能是无穷大(16个字节)。可能是重复的。在某些系统上~1.5 GB的限制是正确的。对于64位快速回答-大约2^64,OS可能会感谢您提供非常详细的回答。感谢您抽出时间给我一个全面的答案。+1来自我-这是一个很棒的答案。考虑周到,写得好。谢谢你的回答。非常有帮助。感谢您抽出时间回答。您的回答很有帮助。@dunukadev有关MacOS X复杂的32位与64位模式的详细解释,请参阅。