1 四种GC垃圾回收算法(Hotspot)
1.1 引用计数法
引用计数法,是通过引用计数器,来维护每个对象被引用的次数,如果被引用次数为0 则允许被垃圾回收。对象每新增一个被引用则引用计数器++,减少则–。
缺点:
没有办法解决循环引用的问题,比如A-B, B->A 则永远不会被垃圾回收。现在已经不怎么使用了
GCRoot
标记算法我们可以了解为一个可达性算法,所以所有的可达性算法都会有起点,那么这个起点就是GC Root,也就是需要通过GC Root 找出所有活的对象,那么剩下所有的没有标记的对象就是需要回收的对象。
GCRoot 在哪里
- 所有Java线程当前活跃的栈帧里指向GC堆里的对象的引用;换句话说,当前所有正在被调用的方法的引用类型的参数/局部变量/临时值。
- VM的一些静态数据结构里指向GC堆里的对象的引用,例如说HotSpot VM里的Universe里有很多这样的引用。
1.2 复制
复制算法主要应用于Yong代。
Hotspot JVM 吧年轻代分了三部分,1个Eden区和1个From区1个To区,比例8:1:1
原理:
从跟集合GC ROOT 开始,通过Tracing 从From 钟找到存货对象,拷贝到To中,From,To交换身份,下次内存分配从To开始。
优点:没碎片
缺点: 耗空间,To区域要始终为空准备接受,从From区域复制来的数据
Eden区对象存活率低,一般的,使用两块10%的内存作为空闲和活动区间,而另外80%的内存,则用来给新建对象分配内存的。一旦发生GC,将10%的from活动区间与另外的80%中存活的eden对象转移到10%的to空闲区间,接下来将之前90%的内存全部释放。以此类推。
1.3 标记清除
主要用在Old区域
先标记,再清除
优点: 节约空间
缺点: 产生碎片,两次扫描(标记+清除)耗时
1.4 标记压缩
对比于标记清除,会再多一步,压缩,将不连续的对象,重新编排,使之连续,整理出连续的内存区域。
优点:没有碎片,节约空间
缺点:效率低,比复制算法慢
2 GC 日志分析
通过在启动参数中添加
-XX:+PrintGCDetails
开启详细的GC日志。
GC 日志主要有以下两类
yongGC
FullGC
YongGC(Minor GC) 和FullGC(MajorGC)区别
在jvm进行垃圾回收的时候,并非每次都对,年轻代,老年代,元空间三个区域同时进行回收。YongGC 只发生在年轻代区域,FullGC 为全局GC 发生在三个区域都会发生。
- Minor GC: 发生在新生4,pingfan代区域的垃圾回收。通常java 对象存活率不高,所以yongGC 会比较频繁,速度也比较快
- Major GC : 全局GC ,指的是发生在老年代的GC垃圾回收,通常都会先一次或者多次MinorGC 之后,内存空间仍然不足,才会触发Full GC, Full GC 速度一般比 Minor GC 速度慢10倍以上。在FullGC 之后仍然没有太多可用空间,则会抛出OOM
HotSpot虚拟机GC 主要有以下特点
- 次数上频繁收集Young区
- 次数上较少收集Old区
- 基本不动元空间