Java堆空间和RAM

时间:2014-02-07 15:09:45

标签: java jvm heap heap-memory jvm-hotspot

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

This链接指出32位Windows计算机上的最大堆大小约为1.4 - 1.6 GB。

我的问题是,如果你有大约8GB的RAM,这是否意味着我只能使用1.4-1.6 GB,如果我是你的32位JVM?那么64位JVM允许的最大大小是多少?

感谢你对此的帮助,因为我对此感到困惑。

4 个答案:

答案 0 :(得分:4)

专门针对Windows,原因是热点(sun / oracle JVM)和windows dll的实现组合。

32位代码可以访问4GB的虚拟地址空间(有扩展允许更多,但我不会进入那些)。

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

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

除此之外,热点JVM仅支持分配单个连续的内存块以用作堆空间。

所以,如果你试着想象一下这个,你会看到你有一个约2GB的空白区域,其中有一个“墙”的windows * .dll加载到~1.6GB。这是这个数字背后的逻辑。它还意味着即使你提供/ 3GB标志,sun / oracle JVM也无法使用它。其他一些虚拟机更擅长处理碎片堆 - 比如jrockit VM

您也可以尝试rebasing windows dlls,以便加载到更高的内存地址并挤出更多可用的堆空间,但这个过程很脆弱。

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

在64位版本的Windows the addressable limit is 8-128TB上,物理限制现在为64TB

答案 1 :(得分:1)

jvm和os也使用分页内存管理系统为我们获取4G虚拟内存

32位操作系统

但是如果你有8G ram,你必须使用64位版本的os来获得最高性能os

答案 2 :(得分:1)

这取决于您的操作系统,32位版本的MacOS X和Linux有一些能够在内核中访问超过4GB但仍将进程限制为4GB的能力。其他操作系统可能会进一步限制进程内存,因为它们本身需要4GB的一部分。通常,您希望避免将JVM交换到VM,因此您需要知道系统有多少可用内存。

答案 3 :(得分:1)

2 ^ 32 = 4GB是32位可以处理的最大总内存。

JVM仅在32位计算机上获得1.4-1.6GB,因为您仍然需要适应操作系统。

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