在JConsole中,我看到了不同的堆空间“伊甸园”、“幸存者”、“老城”。它们之间的区别是什么?
发布于 2014-01-12 07:54:50
请参阅Memory Management in the Java HotSpotTM Virtual Machine白皮书。
Java将堆划分为两个空间,称为“新一代”和“老一代”。新一代被进一步划分为伊甸园和幸存者空间。
之所以有新的和旧的世代,是因为Java程序中几乎所有的对象都只存在很短的一段时间,并且如果可以在不检查所有长期对象的情况下释放所有短期对象,垃圾收集将会快得多。例如,程序通常具有配置设置和共享数据对象,这些对象在程序的整个生命周期中都有效,而像StringBuilders这样的对象在创建它们的方法甚至还没有返回之前就一直在被创建,它们已经变成了垃圾。理想情况下,在几次方法调用后创建的所有临时对象都可以立即回收,而不会浪费时间查看其他任何东西。
Java如何区分短期对象和长期对象?通过将它们放在不同的存储桶中,并计算它们存活下来的垃圾收集数量。全新的物体进入伊甸园空间。Eden空间经常被垃圾收集,但在检查时,那里几乎所有的东西都已经是垃圾了。少数不是垃圾的对象被移动到Survivor空间。Survivor空间中的对象被标记为它们存活下来的垃圾收集量。一些对象变得不可访问,并相对较快地被垃圾收集,但另一些对象保持可访问,并且在经历了一定数量的垃圾收集后,Java假定它们是长期对象,并将它们提升到老一代。
https://stackoverflow.com/questions/21068698
复制相似问题