文章目录
垃圾回收算法
难易程度:★★★★☆
出现频率:★★★★☆
如果要定位什么是垃圾,有两种方式来确定,第一个是引用计数法,第二个是可达性分析算法
引用计数法
引用计数法刚开始:
引用计数法后面出现这种情况会泄漏内存
可达性分析算法
jvm_15">jvm垃圾回收算法
难易程度:★★★☆☆
出现频率:★★★★☆
标记清除算法
标记整理算法
复制算法
本章总结
JVM 垃圾回收算法有哪些?
- 标记清除算法 :垃圾回收分为2个阶段,分别是标记和清除,效率高,有磁盘碎片,内存不连续
- 标记整理算法:标记清除算法一样,将存活对象都向内存另一端移动,然后清理边界以外的垃圾,无碎片,对象需要移动,效率低
- 复制算法:将原有的内存空间一分为二,每次只用其中的一块,正在使用的对象复制到另一个内存空间中,然后将该内存空间清空,交换两个内存的角色,完成垃圾的回收;无碎片,内存使用率低
JVM中的分代回收
难易程度:★★★☆☆
出现频率:★★★★☆
发现只有A能存活,其他BCDE都要被回收,先把能存活的对象放到To区(因此A首先被放到To区),清除剩下不能存活的对象,全部垃圾回收掉
把A复制到TO区域之后,后面又来了1,2,3,4,5区域,后面又要再次进行垃圾回收了,标记存活对象,复制到From区
复制到From区之后如下图
后面又来了q,w,e,r,t区域,内存再次不足,需要再次垃圾回收
又把存活的W复制到To,把历经数次GC之后依然能够存活的对象放到老年代中。
这里MixedGC等于major GC
本章总结
JVM有哪些垃圾回收器?
难易程度:★★★★☆
出现频率:★★★★☆
在jvm中,实现了多种垃圾收集器,包括:
- 串行垃圾收集器
- 并行垃圾收集器
- CMS(并发)垃圾收集器
- G1垃圾收集器
1.串行垃圾收集器
到达一个安全点之后,有一个线程负责垃圾回收,java应用中所有线程全部阻塞,STW,stop the world
2.并行垃圾收集器
原来多个线程正常运行,到达一个安全点之后,多个线程负责垃圾回收,并且其他java应用的线程全部阻塞,STW,stop the world
3.CMS(并发)垃圾收集器
CMS垃圾回收器主要是针对老年代 垃圾回收的
初始标记是运用可达性分析算法标记GC-ROOT,标记哪些是存活的对象,此时会阻塞其他线程,然后并发标记,此时其他线程正常运行
并发标记阶段追踪当前引用链,查看与A关联到的对象,比如B,c,d这些个都是存活的对象,不能被垃圾回收!
重新标记阶段存在的原因是:并发标记阶段可达性分析算法分析出来X不可达,后面因为代码一直在运行,也可能导致有引用引用了X,因此还需要多一个“重新标记”!!
本章小结
详细聊一下G1垃圾回收器
难易程度:★★★★☆
出现频率:★★★★☆
年轻代垃圾回收
这里G1的年轻代回收其实就是前面提到的分代回收机制
E是Eden,S是survivor,O是Old
E是Eden,S是survivor,O是Old
老年代阈值超过45% 时,触发CMS并发标记,并发标记阶段无需STW,但是重新标记阶段会STW,处理漏标的对象
混合垃圾回收是把老年代里面回收价值较高的对象,连同年轻代里面的Eden区,Survivor区,一起进行垃圾回收,这就是mixed Collection!
Eden区和To区复制到From区,From区域原来的对象复制到新的老年代Old中
下图标红的是老年代Old里面回收价值高的对象,一起回收了!
如果一个对象太大了,一个区域装不下,会存储到一个巨型对象中,分配一个连续的区域存储巨型对象
本章小结
详细聊一下G1垃圾回收器
- 应用于新生代和老年代,在JDK9之后默认使用G1
- 划分成多个区域,每个区域都可以充当 eden,survivor,old, humongous,其中 humongous 专为大对象准备
- 采用复制算法
- 响应时间与吞吐量兼顾
- 分成三个阶段:新生代回收(stw)、并发标记(重新标记stw)、混合收集
- 如果并发失败(即回收速度赶不上创建新对象速度),会触发 Full GC,Full-GC的话,用户暂停时间较长,长时间STW