JVM分代管理

59 阅读2分钟

为什么要分代管理?

回答:一般有以下几个原因

  1. 大部分对象的生命周期较短

因为大部分对象生成出来很快就不再使用了,所以在青年代就会对这些垃圾进行回收

  1. 提高垃圾回收效率
    1. 新生代垃圾回收:
      1. 新生代中氛围Eden区和Survivor区,JVM为了快速清理生命周期较短的对象就在Eden区中反复快速的MinorGc垃圾回收,当一次MinorGC回收不掉的就会将对象放入Survivor区,Survivor区当多次MinorGC回收不掉的对象就会将其放入老年代
    1. 老年代垃圾回收:
      1. 老年代中存放的都是生命周期比较长的对象,当老年代满的时候将会进行MajorGC回收。如果老年代也无法容纳更多对象的时候就会导致内存溢出。

MinorGC垃圾回收

它采用的是“复制内存”垃圾回收算法,当拿到一块内存后将会对内存进行一分为二,假设A内存现在是使用区域,B就是备用区域,当A内存要进行垃圾回收的时候就会把要回收的对象进行标记,未标记的对象就会拿到B区当中存放,A内存中就会对垃圾对象进行GC回收

优点:此算法不会产生内存碎片的问题造成

缺点:内存浪费,B内存在前期就无法被使用,只是在等待A内存的垃圾回收

MajorGC垃圾回收

它采用的是“标记清除”和“标记整理”两套算法,标记清除算法就是将老年代中的垃圾对象进行标记,然后进行清除。而标记整理算法就是将老年代中的垃圾对象进行标记后将存活对象放在左测排列,垃圾对象放在右侧排列,再进行回收。

优点:相对复制算法节省内存空间

缺点:效率低,需要进行整理

那什么时候使用标记清楚? 什么时候使用标记整理?

在JVM中并不会按特定规则去指定用哪个算法进行垃圾回收,都是根据以下几个情况采取方案

  1. 碎片化程度
  2. 应用程序对时间和空间的需求

GC垃圾回收时为什么程序会停顿?

这个停顿也叫做STW(Stop The World),其实这就可以理解为你在收拾屋子,有一个人在不断制造垃圾,那这个屋子肯定是一直收拾不干净的,此时要制止制造垃圾的人继续制造垃圾,所以就要把程序停顿。