Java堆内存是连续的吗?

Java堆内存是连续的吗?,java,jvm,heap,Java,Jvm,Heap,我看到有人评论Java堆内存是连续的,而有人则相反。那么,有人能给我一个最终的答案并解释这个问题吗?另外,Java堆中是否有Java堆栈中的数据结构?真正的答案是,您不知道也不应该关心。有不同的JVM,除了规范之外,没有人做出任何承诺。引用:堆的内存不需要是连续的。因此,您的代码不应该假设堆的连续性。它取决于JVM,但绝对不能保证是连续的。HotSpot使用分代堆,而IBMJDK和JRockit不使用。我相信IBM和JRockit垃圾收集过程都使用了一种扫描/压缩算法,实际上应该会产生一个连续堆

我看到有人评论Java堆内存是连续的,而有人则相反。那么,有人能给我一个最终的答案并解释这个问题吗?另外,Java堆中是否有Java堆栈中的数据结构?

真正的答案是,您不知道也不应该关心。有不同的JVM,除了规范之外,没有人做出任何承诺。

引用:堆的内存不需要是连续的。因此,您的代码不应该假设堆的连续性。

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

堆的内存不需要是连续的?这是什么意思?这意味着要实现规范,您不必拥有连续堆。它并没有说堆不应该是连续的。热点堆(Sun/oraclejvm)是连续的,我已经执行了测试来确认它。顺便说一句,这句话适用于其他供应商,例如IBM,他们已经将堆拆分为多个部分,大多数是非连续的,有些是。如果您的目的是编写Java代码,在任何JVM上运行,而不仅仅是Sun/Oracle JVM,那么您不应该对堆的连续性进行假设。此外,您的测试仅证明Sun/Oracle JVM当前有一个连续堆。未来的版本可以采用IBM的方法,并打破任何假定为连续堆的代码。我只是说,默认情况下,它使用连续堆,很可能是为了向后兼容。请参阅和>我相信IBM和JRockit垃圾收集过程都使用了扫描/压缩算法,这在实践中应该会导致连续堆。它比这稍微复杂一些。看Oracle上有一篇关于JRockit和非连续堆的文档,我现在找不到,don;I don’我没有时间,重要的是要知道;但是,您应该假设它不是连续的,并相应地进行规划。这意味着更小的对象和更大的紧凑对象/类,以减少缓存未命中和扩展内存查找。小对象是内存性能和缓存未命中的祸根。