JVM 新生代/老年代

JVM GC 流程图

图1

新生代

  • 主要是用来存放新生对象,一般占据对的1/3,由于频繁的创建对象,所以新生代会频繁的触发MinorGC进行垃圾回收
  • 新生代又分为Eden,SurvivorTo,SurvivorForm三个区
  • Eden区:JAVA新对象的出生地(如果新创建的对象占用内存很大,就直接分配到老年代),当Eden内存不够时,将触发一次MinorGC,对新生代进行一次回收,Eden占整个新生代的80%
  • SurvivorTo(SurvivorForm):保留了一次MinorGC的幸存者,占用新生代的10%
  • SurvivorForm(SurvivorTo):上一次MinorGC的幸存者,将和Eden一次参与这一次MinorGC扫描,占用新生代的10%
  • MinorGC的过程如果这次GC还幸存下来的对象,将复制到SurvivorTo中, SurvivorTo变成SurvivorForm,SurvivorForm变成SurvivorTo,并将对象年龄+1,这里就采用了标记-复制算法(由于新生代中都是朝生夕灭),如果发现SurvivorForm中的对象达到了老年标准,就把对象移动到老年代,一般年龄默认是15

老年代

  • 老年代主要存放的对象都比较稳定,一般存放的是应用程序中生命周期长的对象,当然也不排除有些朝生夕死的大对象,所以FullGC不会频繁的执行
  • 一般进行FullGC之前都会触发一次MinorGC,使得新对象晋升到老年代使得老年代内存不足而触发FullGC,或者是大对象直接进入老年代导致老年代内存不足而触发
  • FullGC采用标记-整理算法,因为每次GC后会造成大量的内存碎片,造成内存的不连续性,所以FullGC首先会先扫描一遍老年代,标记存活和要回收的对象,然后在进行整理,是存活的对象都移动到一端,最后直接对端边界的内存(回收对象)进行回收
  • 如果当老年代也装不下的时候就会抛出Out of Memeory(OOM)异常
文章作者: 怀风
文章链接: http://blog.leishunyu.com/2019/01/10/2019-01-10-jvm新生代:老年代/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Maple