jvm垃圾收集的一个问题,望大虾抽空回答

chenjingbo 2011-07-08
   我有一个疑问,就是在新生代中,按照hotspot jvm的做法是分成一块eden 两块suvivor 。系统默认是8:1:1 。一般的做法是在gc的时候,将eden 和其中suvivor中from space  的存活对象复制到to space中。我的疑问是,为什么不直接分一块eden 一块suvivor,然后自己设置两个的比例。
   刚才问了另外一个朋友,他的回答是多区域可以同步复制和比例可调。。但是疑问还是没消,同步复制的话那不是可以分为n个空间,不一定只分成三个,比例可调的话就算只分成两块,比例也是可以调节的吧。。
   望大虾们赐教。
huxi 2011-07-08
chenjingbo 写道
我的疑问是,为什么不直接分一块eden 一块survivor,然后自己设置两个的比例。

你可以自己调节eden和survivor的大小比例。heap分为新生代和旧生代是为了根据其特性使用不同的垃圾回收算法。Oracle HotSpot认为在新生代中的对象存活时间是很短的,而新生代的垃圾回收使用了Copying算法,那么既然是Copy就总得有from和to吧,所以survivor分成了S0和S1,即两部分,也就是from和to。新建的对象大部分都在eden上分配(大对象直接分配在旧生代),经历GC后会被移动到survivor区,在经历几次GC后(S0和S1之间copy),依旧存活的对象被移动到旧生代。每次GC后,S0和S1只有其中一个区域被占用,另一部分就是是空的了。
chenjingbo 2011-07-08
十分感谢您的回答,我差不多弄清楚了。
Global site tag (gtag.js) - Google Analytics