有哪些不同的Java堆空间?

时间:2014-01-11 22:28:01

标签: java memory heap

在JConsole中,我看到不同的堆空间“Eden”,“Survivor”,“Old”。 他们之间有什么区别?

1 个答案:

答案 0 :(得分:0)

请参阅Memory Management in the Java HotSpotTM Virtual Machine白皮书。

Java将堆分为两个名为“代”的空间,即新一代和旧代。新一代进一步分为伊甸园和幸存者空间。

拥有New和Old世代的原因是因为Java程序中的几乎所有对象都只存在很短的时间,并且如果短期对象都可以在不检查所有长寿命对象的情况下被释放,那么垃圾收集会快得多。例如,程序通常具有在程序的整个生命周期中存在的配置设置和共享数​​据对象,而像StringBuilders这样的对象经常被创建,在创建它们的方法甚至返回之前变为垃圾。理想情况下,在几次方法调用之后创建的所有临时对象都可以立即回收,而不会浪费时间查看其他任何内容。

Java如何区分短寿命和长寿命对象?通过将它们放入不同的桶中并计算它们存活的垃圾收集量。全新的物体进入伊甸园空间。伊甸园空间经常被垃圾收集,但是当它被检查时,其中几乎所有东西都已经是垃圾。少数非垃圾的物体被移入幸存者空间。 Survivor空间中的对象被标记为它们存活了多少垃圾收集。有些变得无法访问并且相对较快地被垃圾收集,但是其他人仍然可以访问,并且在他们幸存了一些阈值数量的垃圾收集之后,Java假定它们是长期存在的对象并且将它们提升到老一代。