【问题标题】:Is the Java Heap Memory contiguous?Java堆内存是连续的吗?
【发布时间】:2011-12-10 09:24:21
【问题描述】:

我看到人们评论 Java 堆内存是连续的,而人们却说相反。那么,有人可以给我一个最终的答案并解释这个问题吗?另外,Java Heap 中是否有某种数据结构,就像 Java Stack 中一样?

【问题讨论】:

    标签: java jvm heap-memory


    【解决方案1】:

    引用JVM spec堆的内存不需要是连续的。所以你的代码不应该对堆的连续性做出假设。

    【讨论】:

    • 堆的内存不需要是连续的吗?那是什么意思 ?这意味着要满足规范,您不必有一个连续的堆。它并没有说堆不应该是连续的。 HotSpot 堆(Sun/Oracle JVM)是​​连续的,我已经执行了确认它的测试。顺便说一句,这句话适用于其他供应商,例如 IBM,他们将堆分成几部分,大多数是不连续的,有些是。
    • 如果您的意图是编写可在任何 JVM 上运行的 Java 代码,而不仅仅是 Sun/Oracle JVM,那么您不应假设堆的连续性。此外,您的测试仅证明 Sun/Oracle JVM 当前 具有连续堆。未来的版本可能会采用 IBM 方法并破坏任何假定连续堆的代码。
    • 确实,一旦我切换到 G1 gc,它就不再是连续的了。我只是说,默认情况下它使用一个连续的堆,很可能是为了向后兼容。见javabook.compuware.com/content/memory/the-three-jvms.aspxjavarevisited.blogspot.fr/2013/01/…
    【解决方案2】:

    真正的答案是,你不知道也不应该关心。有不同的 JVM,除了规范没有人承诺任何事情。

    【讨论】:

    • 重要的是要知道;但是,您应该假设它不是连续的并相应地进行计划。这意味着更少的小对象和更多的大型紧凑对象/类,以减少缓存未命中和扩展内存查找。小对象是内存性能和缓存未命中的祸根。
    【解决方案3】:

    它取决于 JVM,但绝对不能保证是连续的。 HotSpot 使用分代堆,而 IBM JDK 和 JRockit 不使用。我相信 IBM 和 JRockit 垃圾收集过程都使用了扫描/压缩算法,这在实践中应该会产生一个连续的堆。

    【讨论】:

    • > 我相信 IBM 和 JRockit 垃圾回收进程都使用了扫描/压缩算法,这在实践中应该会产生一个连续的堆。它比这稍微复杂一些。请参阅publib.boulder.ibm.com/infocenter/realtime/v2r0/…Oracle 上有一个关于 JRockit 和非连续堆的文档,我现在找不到,没有时间。
    猜你喜欢
    • 2011-07-02
    • 2018-09-10
    • 2023-04-08
    • 2015-01-18
    • 1970-01-01
    • 2014-02-17
    • 2012-07-09
    • 1970-01-01
    • 2021-06-07
    相关资源
    最近更新 更多