Java堆分布概念查询

时间:2012-09-14 09:47:36

标签: java java-ee memory memory-management

我在GC内存参数下面使用:

export MEM_OPTS =“ - Xmx2900m -Xms2900m -XX:NewSize = 786m -XX:MaxNewSize = 786m -XX:+ UseTLAB -XX:MaxPermSize = 128m”

我使用的是32位JVM。我的服务器RAM是10 GB。

从Oracle网站,我得到了

  

为什么我不能使用32位JVM获得更大的堆

32位JVM的最大理论堆限制是4G。由于各种其他限制,例如可用交换,内核地址空间使用,内存碎片和VM开销,实际上限制可以低得多。在大多数现代32位Windows系统上,最大堆大小范围为1.4G到1.6G。在32位Solaris内核上,地址空间限制为2G。在运行32位VM的64位操作系统上,最大堆大小可能更高,在许多Solaris系统上接近4G。 从Java SE 6开始,不支持Windows / 3GB boot.ini功能。 如果您的应用程序需要非常大的堆,则应在支持64位应用程序的操作系统版本上使用64位VM。有关详细信息,请参阅Java SE支持的系统配置。

Ok.Now让假设我的32位服务器可以占用3.2 GB。据我所知:

-Xmx is the total heap memory
-XX:NewSize / -XX:MaxNewSize is the range of the size of the new generation inside that heap
the difference is the range of the size of the old generation
-XX:PermSize / -XX:MaxPermSize is the range of the size of the permanent generation, which is the non-heap memory

根据这个,3.2 GB不应该包含PermSize,因为这不是堆内容。对吗?

如果我错了,请告诉我。

我可以在Xmx和NewSize中划分3.2 GB。对吗?

1 个答案:

答案 0 :(得分:1)

NewSize是最大堆大小的一部分。它必须更小。

如果你有Java 6,我会使用64位JVM,因为它会让你的生活变得更简单。 ;)除非你必须使用32位共享库,否则几乎没有什么不妥。

BTW -XX:+UseTLAB是默认值。