一、绑定对象是否为垃圾的算法
1、引用计数法
一个实例对象都有一个引用计数器,引用一次加一,释放-1
优点:执行效率高,程序受形象小
缺点:无法检测循环引用的情况,导致内存泄漏。
2、可达性分析算法
通过判断对象的引用链是否可达来确定对象是否可以回收。
二、垃圾回收算法
1、标记清除算法
从头到尾扫描一遍,对活的对象进行标记,回收不可达的对象。
缺点:会产生碎片化。
2、复制算法
适用于对象存活率低的场景
分为两面:对象面空闲面
对象在对象面上创建,将标记的复制到空闲面,然后统一清除对象面。
3、标记整理算法
(老年代的回收)
先标记,然后将活的对象从头进行排序,将剩下没有排序的进行清除。
优点:
(1)、避免了碎片化
(2)、不用分成两个内存区域了。
(3)、适用于存活率较高的场景
4、分代收集算法(主流)
将对象按照生命周期的不同分成老年代(FullGC)年轻代(Minor GC)
年轻代
Eden 区:8 活的就会转入Surviver区
Surviver区:2
三、如何晋升到老年代
1、经过一定次数的年轻代之后就会转入老年代
2、Surviver区装不下的
3、新生的大对象。
常见的调优参数
1、-XX SurvivorRatio:Eden和其中一个Survivor的比值
2、-XX NewRatio :老年代和年轻代的比值
老年代
四、触发老年代的条件
1、老年代/永久代空间不足
2、CMS GC出现
promotiom failed/concurrent mode failure
3、MinorganicGC晋升到老年代的平均大小>老年代的剩余空间
4、调用Sustem.gc()
五、常见的垃圾收集器
1、jvm的运行模式
(1)、 server:重量级jvm启动慢但是速度快
(2)、client:相反
2、Serial收集器
采用复制算法。单线程收集器,进行垃圾收集的时候必须暂停所有共组线程。
简单高效是client下年轻代默认的收集器。
3、ParNew收集器
采用复制算法
多线程收集器
4、Parallel Scavenge收集器
采用复制算法
更关注的是用户的吞吐量,适用于后台运算没有太多交换的情况。
5、Serial Old收集器
采用标记整理算法
单线程收集器
client下老年代默认的收集器
6、Parallel Old收集器
多线程,吞吐量优先
采用标记整理算法
7、CMS收集器
采用标记清楚算法
过程:
(1)、初始化标记:stop-the-word
(2)、并发标记:并发追溯标记,程序不会停顿
(3)、并发预处理:查找执行并发标记阶段从年轻代晋升到老年代的对象。
(4)、重新标记:stop-the-word 暂停虚拟机扫描CMS堆中的剩余对象。
(5)、并发清理:清理垃圾对象,程序不会停止
(6)、并发重置:重置CMS收集器的结构
G1收集器
采用复制加标记整理算法
Garbage Frist收集器特点
1、并发并行
2、可预测的停顿
3、分代收集
六、java中强引用、软引用、弱引用、虚引用详解
1、强引用
Object o=new Object();
抛出OutOfMenoryError终止程序而不会回收
通过将对象设置成null来弱化引用。
2、软引用(softErferen)
SoftReferencesoftref=new SoftReference(str);
对象处在有用但非必须的状态,只有空间不足时才可能回收,可以用来高速缓存。
3、弱引用(Weak Reference)
GC时会被回收,适用于偶尔使用但不想想垃圾回收的对象。
4、虚引用(PhantomReference)
不会决定对象的生命周期
任何时候都可以被回收
可用于跟踪对象被垃圾收集器回收的活动,起到哨兵的作用
必须和引用队列联合使用
第六章:Java垃圾回收机制
最新推荐文章于 2024-04-27 22:46:29 发布