GC 垃圾回收(Java)

2019-10-10  本文已影响0人  雁度寒崖

对象被判断为垃圾的标准

引用计数算法(基本不用)

1.通过判断对象引用的数量决定对象是否被回收
2.每个对象都有一个引用计数器,被引用+1,引用完-1(变量被赋予新值,或含参方法调用完毕)
3.引用计数为0的对象就可以被回收了。
优点:执行效率高,程序执行受影响较小。
缺点:无法检测出循环引用,导致内存泄漏。

可达性分析算法()

通过判断对象的引用链是否可达来决定对象是否可以被回收(图论)
可以作为GC Root的对象
1.栈中引用的对象(栈帧中的本地变量表)new了一个Object赋值给一个局部变量 Object就是Root
2.方法区中常量引用的对象
3.方法区中的类静态属性引用的对象
4.本地方法栈JNI以及Native的引用的对象
5.活跃的现成的对象

垃圾回收算法

标记清楚算法

标记:从根基和进行扫描,对存活的对象进行标记
清除:堆堆内存从头到尾进行线性遍历,回收不可达对象内存
会产生很多不连续的内存碎片
viewter出入暂停状态,collector处于尝试垃圾收集,直到OutOfMemoryError错误

复制算法

分为对象面和空闲面
对象在对象面上创建
存活的对象被从对象面复制到空闲面
将对象面所有对象内存清除
特点:
1.解决碎片化问题
2.顺序分配内存,简单高效
3.适用于对象存活率低的场景

标记整理算法

标记:从根集合进行扫描,对存活的对象进行标记
清除:移动所有存活的对象,且按照内存地址次序依次排列,然后将末端内存地址以后的内存全部回收
特点:
1.避免内存不连续性
2.不用设置两块内存互换
3.适用于存活率高的场景

分代收集算法

按照对象生命周期的不同划分区域采用不同的垃圾回收算法
目的:提高JVM回收效率
JDK8及以后的版本
只有年轻代和老年代
年轻代几乎是所有Java对象出生的地方(Java申请的内存,存放都在这里,(Java对象通常不需要长久存活))
年轻代存活率低(复制算法)
老年代存活率高(标记清除算法,标记整理算法)

GC分类

Minor GC(发生在年轻代中,复制算法)
Eden(伊甸)区:对象刚被创建的时候,首先放在这个区,放不下再考虑老年代或者Survivor区
两个Survivor区(from和to):
Full GC()
1
1
1
1
1
1
1
1
1
1
1
1

上一篇下一篇

猜你喜欢

热点阅读