本次学习的主要内容如下:
- 如何判断对象可以回收
- 垃圾回收算法
- 分代垃圾回收
- 垃圾回收器
- 垃圾回收调优
JVM采用的可达性分析算法
- Java虚拟机中的垃圾回收器采用可达性分析来探索所有存活的对象
- 扫描堆中的对象,看是否能够沿着GC Root对象为起点的引用链找到该对象,找不到,表示可以回收
四种引用
1、强引用
当没有任何对象跟其有引用时,就会被垃圾回收机制回收
2、软引用
无强引用引用时,发生垃圾回收后,且发现内存仍然不足,就会被垃圾回收机制回收
3、弱引用
无强引用引用时,发生垃圾回收,不管内存是否充足,都会被回收掉
4、虚引用
必须配合引用队列使用,虚拟引用引用的对象被垃圾回收时,虚引用自己就会放入引用队列,而间接的用线程调用虚拟引用对象的方法,调用Unsafe.greeMemory去释放直接内存
5、终结器引用
必须配合引用队列使用,当其对象被回收时,会将终结器引用加入引用队列,此时其对象还未被垃圾回收,再由FinallizeHandler线程去查看引用队列是否有终结器引用,若有,则会找到对应的对象并且调用其finallize()方法,使其下次垃圾回收时会被回收
垃圾回收算法
标记清楚:第一个阶段先标记哪些可能是垃圾,第二个阶段就是把垃圾占用的空间释放;其优点就是速度快,但是容易导致空间不连续,导致产生内存碎片
标记整理:清理的过程中将可用的对象向前移动,使内存更为紧凑。就不会再产生内存碎片了,但是效率较低
复制:有两个区域FROM和TO,将不被引用的对象标记为垃圾,然后清除,将存活的对象复制到TO区,不会产生碎片但是会占用双倍内存空间
分代回收
主要分为两个大区域:新生代和老年代;经常要使用的对象放在老年代中,而用完就可以删掉的对象放在新生代中
minor gc会引发 stop the world,暂停其他用户的线程,等垃圾回收结束,用户线程才恢复运行;当老年代空间不足,会先尝试触发minor gc,如果之后空间仍不足,那么触发full gc,STW时间更长
垃圾回收器
1、串行垃圾回收器
·单线程
·堆内存较小,适合个人电脑
2、吞吐量优先的垃圾回收器
·多线程
·堆内存较大,多核cpu
·让单位时间内,STW的时间最短
3、响应时间优先的垃圾回收器
·多线程
·堆内存较大,多核cpu
·尽可能让单次STW的时间最短