Java的JVM垃圾回收知识点

66 阅读3分钟

1、对象什么时候可以被垃圾回收器回收

如果一个或多个对象没有任何的引用指向它了,那么这个对象现在就是垃圾,如果定位了垃圾,则有可能会被垃圾回收器回收。

定位垃圾的方式有两种:

  • 可用计数法
  • 可达性分析法 (使用)

2、JVM垃圾回收算法有哪些

  • 标记清除算法:垃圾回收分为2个阶段,分别是标记和清除,效率高,有磁盘碎片,内存不连续(用的比较少)。
  • 标记整理算法:与标记清除算法一样,将存活对象都向内存另一端移动,然后清理边界以外的垃圾,无碎片,对象需要移动,效率低(一般老年代的垃圾回收器会使用)。
  • 复制算法:将原有的内存空间一分为二,每次只用其中的一块,正在使用的对象复制到另外一个内存空间中,然后将内存空间清空,交换两个内存的角色,完成垃圾的回收;无碎片,内存使用率低(一般年轻代的垃圾回收器使用)

3、JVM的分代回收

3.1 堆的区域划分

  • 堆对被分为了两份:新生代和两年带【1:2】
  • 对于新生代,内部又被分为了三个区域。Eden区,幸存者区survivor(分为from和to)【8:1:1】

3.2 对象回收分代回收策略

  1. 新创建的对象,将会先分配到eden区
  2. 当伊甸园区内存不足,标记伊甸园与from(现阶段没有)的存活对象
  3. 将存活对象采用复制算法复制到to中,复制完毕后,伊甸园和from内存都得到释放
  4. 经过一段时间后伊甸园的内存又出现不足,标记Eden区域to区存活的对象,将其复制到from区域
  5. 当幸存区对象熬过几次回收(最多15次),晋升到老年代(幸存区内存不足或大对象会提前晋升)

4、MinorGC、Mixed GC、FullGC有什么区别

MinorGC【young GC】发生在新生代的垃圾回收,暂停时间短(STW)

Mixed GC 新生代 + 老年代部分区域的垃圾回收,G1收集器持有

FullGC:新生代+老年代完整垃圾回收,暂停时间长(STW),应尽力避免

5、JVM有哪些垃圾回收器

  • 串行垃圾回收器:Serial GC 、 Serial Old GC
  • 并行垃圾回收器:Parallel Old GC 、 ParNew GC
  • CMS(并发)垃圾回收器:CMS GC,作用在老年代
  • G1垃圾回收器,作用在新生代和老年代

6、聊下G1垃圾回收器

  • 应用于新生代和老年代,在JDK9之后默认使用G1
  • 划分成多个区域,每个区域都可以充当Eden,survivor,old,humongous,其中humongous专为大对象准备
  • 采用复制算法
  • 响应时间与吞吐量兼顾
  • 分成三个阶段:新生代回收(stw)、并发标记(重新标记stw)、混合收集
  • 如果并发失败(即回收速度赶不上创建新对象速度),会触发FUll GC

7、强引用、软引用、弱引用、虚引用的却别

  • 强引用:只要所有GC Roots 能找到,就不会被回收
  • 软引用:需要配合SoftReference使用,当垃圾多次回收,内存依然不够的时候会回收软引用对象
  • 弱引用:需要配合WeakReference使用,只要进行了垃圾回收,就会把弱引用对象回收
  • 虚引用:必须配合引用队列,被引用对象回收时,会将虚拟应用入队,由Reference Handler线程调用虚引用相关方法释放直接内存