Java GC 必知必会

2021-03-10  本文已影响0人  我不想成为胖子

1. Java 如何标识垃圾

常用的标识算法主要是两类,一是计数器引用法,二是可达性分析(根搜索算法)。

image.png

2. GC ROOTS 包含哪些?

特殊情况:
有对象“临时性”的加入,共同构成完成GC Roots集合。比如分代收集和局部回收(Partial GC)

image.png image.png

3. 为什么会产生STW

如果要使用可达性分析算法来判断内存是否可回收,那么分析工作必须在一个能保障一致性的快照中进行。这点不满足的话,那分析的结果准确性也就无法保障。

所以就会产生了Stop The World的一个重要原因。

4. 对象的finalization机制

finalization为什么不要手工调用

finalization 导致对象复活的情况
在虚拟机定义中,对象存在三种状态
1. 可触及的:从GC ROOT可达
2. 可复活的:对象多有的引用都被释放了,但是对象可能在finalization() 被复活。
3. 不可触及的:对象的finalization()被调用,并且没有复活。那么就会就如不可触及的状态。不可触及的对象就一定会被回收。因为finalization只会被调用一次。

5. 如何判断一个对象是否可以被回收?

判断一个对象能否被收回,至少要经历两次判断。

  1. 如果objA到GC Roots没有引用链,则进行第一次标记
  2. 判断对象是否有必要执行finalization()方法
    • 如果没有重写finalization()或者finalization()已经被执行过了,则被判断为不可触及的。
    • 如果对象重写了finalization()方法,且还未被执行过。那么objA会被插入到F-Queue队列中,由一个虚拟机自动创建的低优先级的finalizer线程触发其finalization()。

6. JVM GC 清除阶段的算法

6.1 标记-清除算法(Mark-Sweep)

image.png image.png
  1. 效率不算高
  2. 会产生内存碎片,还需要额外的空间维护一个空闲列表。

6.2 复制算法(Copying)

image.png image.png

优点:

缺点:

6.3 标记-压缩算法(Mark-Compact)

image.png image.png

优点

缺点

image.png

7. GC 分带收集算法&增量收集算法&分区算法

分带收集算法

image.png

增量收集算法

image.png

分区算法

image.png

8. System.gc()和Runtime.getRuntime().gc()的理解

gc与slot的关系

image.png

在这个案例中 buffer所占用空间不会被回收,因为slot=1的位置还是被buffer这个变量所占用。在gc时,属于GC Root可达的情况。

9. 程序的并行与并发

image.png

垃圾回收器的并行与并发

image.png image.png

10. GC 中的安全点与安全区域的说明

如何让线程在安全点中断:


image.png

实际执行流程

image.png

11. java引用:强,软,弱,虚

  1. 只被弱引用关联的对象,只能存活到下一次GC发生为止。
  2. 常用的实现类是WeekHashMap,在Tomcat中作为了一个LRU的cache实现。

软引用和弱引用的区别点:


image.png
  1. 使用场景:追踪垃圾回收
上一篇 下一篇

猜你喜欢

热点阅读