JAVA中的GC与内存分配策略

JAVA中大多数情况下,对象默认在Eden中分配,在触发GC时如果survivor空间不足就会放到老年代里面去。
假设如下情景:
eden:80M survivor1:10M survivor2:10M
现在survivor2是空的,然后在eden中总计6M的对象存活,在survivor1中有总计5M的对象存活,那么我们有总共11M的东西存活,survivor2只有10M的空间大小,因此是无法都复制到survivor2中去的,就需要老年代,问题是有多少东西要复制到老年代中去,是全部11M的东西都复制进去,还是说在survivor2中存满10M(假设对象组合可以刚好分为10M和1M),然后剩下1M的东西存放到老年代中去。是有什么算法吗?还有,如果在eden中的6M就是一个对象(也就是一个对象就6M,没有其他对象),在survivor1中一个对象就5M,那么又有哪些对象是要复制到survivor2中,哪些复制到老年代中呢??是按最大的6M存放吗??

阅读 2k
1 个回答

看了一下深入了解JAVA虚拟机。这个时候会执行空间分配担保策略。他的原话是这么说的:把survivor无法容纳的对象直接进入老年代。所以应该是存满survivor2.然后把剩下的1M存入老年代。

括号内是扩展,你可以跳过(顺便多说几句。在minorgc时。jvm都会检查老年代剩余空间是否大于本次gc存活的对象大小。例如上面剩下的1M对象。老年代空间不足一兆。那么检查虚拟机是否允许承担风险(HandlePromotionFailure参数)。如果允许。还会检查过去几次晋升到老年代的平均大小是否小于目前老年代最大连续可用空间。如果小于。将尝试minorgc 。否则直接进行fullgc。)

还有你说的第二种情况。会执行jvm的大对象直接进入老年代策略(前提是-xx:PretenureSizeThreashold参数的值是大于5M的)。如果老年代无法容纳这两个对象。就会进行fullgc。如果fullgc后还不行。再进行fullgc

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题