目录
- 1、引用计数法
- 2、可达性分析算法
- 3、对象的finalization机制
- 4、寻找GC Roots溯源工具
- 5、标记清除算法
- 6、复制算法
- 7、标记整理算法
- 8、对比三种算法
- 9、分代收集算法
- 10、增量收集算法
- 11、分区算法
一、前言
大家好,我是苍何。最近思考了一个问题,为什么会出现公司面试造火箭,工作扭螺丝的现象,包括各种八股文的连环大绝杀问到你不会为主,其实这是考察你的知识面以及掌握的深度,而为什么需要这样呢?归其原因,无非是通过筛选找到那些会思考的人,他们需要的并不是CRUD的工具人,而是会思考能创新的工程师。
当你深刻理解到这点,我想不用刻意去学习,在工作中,肯定会吾日三省吾身。
于是乎,这个重新开始学习编程系列文章出来了。
愿与君共勉!
这是JVM系列知识的最后一篇文章,本文围绕垃圾回收GC,涉及常用的垃圾回收算法,以及几种垃圾回收器。
二、什么是垃圾
我们知道java语言是支持自动垃圾回收的,我们创建对象后,GC可以为我们回收掉无用的垃圾对象,那么什么是垃圾?
说白了就是,没有人用了就是垃圾
主要是堆中垃圾回收,方法区回收的比较少,因为判断一个类是无用的条件太苛刻了。
三、垃圾回收相关算法
1、引用计数法
每个对象保存了一个引用计数器属性,只要有对象引用他了,就加1,引用失效时,就减1,当引用值为0 的时候,代表就是垃圾对象,该被回收,优点是简单效率较高,缺点是没办法解决循环引用的问题,所以java并没有选择引用计数法。
2、可达性分析算法
以根对象集合GC Roots为起始点,按照从上到下的方式搜索被根对象所连接的目标对象是否可达,内存中的对象都会直接或间接的被根对象相连着,即一个对象的引用链,如果目标对象无任何引用连项链,则是不可达的垃圾对象
GC Roots
3、对象的finalization机制
即是“死亡对象”的一块免死金牌。
4、寻找GC Roots溯源工具
5、标记清除算法
标记可达对象,清除未被标记的垃圾对象。
6、复制算法
新生代中的S0和S1区用的就是复制算法,将活着的内存分为2块区,每次只使用其中一块,GC时将存货对象复制到另一块空闲空间,并清空原来的空间。
如果存货对象太多,就不适合用复制算法,比如老年区存货对象较多,复制过去太消耗时间精力了。
7、标记整理算法
8、对比三种算法
9、分代收集算法
年轻代用复制算法,老年代用标记清除和标记整理算法
10、增量收集算法
11、分区算法
三、垃圾回收相关概念
1、System.gc()
2、内存溢出OOM
3、内存泄漏
还有ThreadLocal也会导致内存泄漏
4、SWT
5、垃圾回收的并行与并发
6、安全点和安全区域
安全点:
安全区域
7、引用相关(强软弱虚)
强引用:引用关系只要还在,不会被GC(99%的场景)
软引用:引用关系还在,内存不够了就GC,内存够就GC(缓存)
弱引用:引用关系还在,也会被GC(缓存)
虚引用:获得一个系统通知,追踪
四、垃圾回收器
1、GC分类和性能指标
2、7款经典的垃圾回收器
JDK8中默认的组合
JDK8也可以用