JDK 7是否使用非连续堆?

时间:2012-08-10 10:06:49

标签: java java-7 jvm-hotspot jrockit

我知道JDK 7应该是hotspot和jrockit之间的合并,并且不会有jrockit 1.7。 (来源:https://blogs.oracle.com/henrik/entry/java_7_questions_answers)我有一个项目需要jrockit的非连续堆特性以及一些java 1.7特性,所以既然JDK 7是一个合并,它是否支持非连续堆,因为我可以'找到一份官方文件说明了吗?

1 个答案:

答案 0 :(得分:2)

我认为你问的是非连续的堆,因为你正在遭受内存碎片的困扰。很多时候你的32位地址空间是碎片化的,但你的64位地址空间却没有。这意味着,如果您的计算机有足够的内存,使用64位JVM将允许您查找32位JVM不会的连续内存。当32位JVM无法分配超过2GB的堆时,我个人使用64位JVM来分配超过4GB的堆。

虽然它看起来不像任意非连续的堆进入JDK 7,但您可以尝试使用G1垃圾收集器。根据{{​​3}}:

  

将堆分区为一组大小相等的堆区域,每个堆区域都是一个连续的虚拟内存范围。

从理论上讲,这允许您使用非连续堆。唯一的限制是区域必须具有相同的大小。

根据http://www.oracle.com/technetwork/java/javase/tech/g1-intro-jsp-135488.html,您可以使用此命令行选项来控制区域大小:

  

-XX:G1HeapRegionSize = n :使用G1,Java堆被细分为大小均匀的区域。这设置了各个子部门的大小。根据堆大小,符合人体工程学地确定此参数的默认值。最小值为1Mb,最大值为32Mb。

我希望这会有所帮助。