我知道 JDK 7 应该是热点和 jrockit 之间的合并,并且不会有 jrockit 1.7。(来源:https : //blogs.oracle.com/henrik/entry/java_7_questions_answers)我有一个项目需要 jrockit 的非连续堆特性以及一些 java 1.7 特性,所以由于 JDK 7 是一个合并,所以它支持非连续堆,因为我找不到这样说的官方文档?
1 回答
我假设您正在询问非连续堆,因为您正遭受内存碎片的困扰。很多时候,您的 32 位地址空间是碎片化的,但您的 64 位地址空间不是。这意味着,如果您的计算机有足够的内存,使用 64 位 JVM 将允许您找到 32 位 JVM 无法找到的连续内存。当 32 位 JVM 无法分配超过 2GB 的堆时,我个人使用 64 位 JVM 来分配超过 4GB 的堆。
尽管它看起来不像是任意非连续堆进入 JDK 7,但您可以尝试使用 G1 垃圾收集器。根据http://www.oracle.com/technetwork/java/javase/tech/g1-intro-jsp-135488.html:
堆被划分为一组大小相等的堆区域,每个区域都是连续的虚拟内存范围。
从理论上讲,这允许您使用非连续堆。唯一的限制是区域的大小必须相同。
根据http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/G1GettingStarted/index.html#t6您可以使用此命令行选项来控制区域大小:
-XX:G1HeapRegionSize=n:在 G1 中,Java 堆被细分为大小一致的区域。这设置了各个细分的大小。此参数的默认值是根据堆大小以符合人体工程学的方式确定的。最小值为 1Mb,最大值为 32Mb。
我希望这有帮助。