码迷,mamicode.com
首页 > 编程语言 > 详细

Java堆内存中为什么有两个survival区及为什么与年轻代比例是1:1:8?

时间:2020-04-08 20:50:01      阅读:240      评论:0      收藏:0      [点我收藏+]

标签:二次   没有   需要   org   对象   msu   角色   性能   影响   

  Java堆内存分为年轻代和老年代,其中,年轻代分为Eden区和survival区,survival又分为fromSurvival和toSurvival。

  首先第一个问题:为什么要有Survival区?因为如果没有Survival区,Eden每进行一次MinorGC,存活对象送到老年代,当老年代被填满就会触发MajorGC,消耗大量时间。当有Survival区后,存活对象可以先被放到此处做一个缓冲,只有经过16次筛选还存活的对象才被移送到老年代,减少MajorGC的发生。

  第二个问题:为什么设置两个Survival区?因为第一次MinorGC后,Survival就会存在一些存活对象,第二次MinorGC后,Eden区的存活对象会放入Survival区,就会与Survival区之前的对象内存不连续,形成内存碎片,时间一长就会影响性能,因此需要两个Survival区,第一次MinorGC时,Eden区的存活对象转移到fromSurvival区,Eden清空,第二次MinorGC时,将Eden和fromSurvival区中存活对象转移到toSurvival,Eden和fromSurvival清空。fromSurvival和toSurvival交换角色,循环往复16次后,再传向老年代。

  


tip:当对象超过Eden区的话,会直接进入老年代!!

Java堆内存中为什么有两个survival区及为什么与年轻代比例是1:1:8?

标签:二次   没有   需要   org   对象   msu   角色   性能   影响   

原文地址:https://www.cnblogs.com/dretrtg/p/12662475.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!