java垃圾回收根对象_Java 垃圾回收(GC)

Java 垃圾回收(GC)知识点整理

基础篇

1、GC判断什么是垃圾引用计数器:根据引用次数计算,存在循环引用的问题(A引用B,但A、B都没有其他对象引用,两者都是垃圾)。

GC Root:可达性分析,从根向下搜索标记, 一般从栈帧的局部变量表开始,寻找他们的引用对象,再从引用对象找其他的变量;常见Root:线程栈变量、JNI指针、常量池、方法区静态变量。

2、垃圾回收算法Mark-Sweep:标记清除,分为标记和清除两个阶段,先标记,再清除。不能整理内存空间,存在碎片化内存空间,分配大内存可能触发新一轮垃圾回收。

Coping:复制算法,内存分为两个大小相等的块,每次用其中一块,一块用完将存活对象移动到另一块并清除当前块。优点:解决内存碎片问题,只需要移动堆指针,简单高效;缺点:内存缩小一半;注:研究表明98%对象朝生夕死,因此使用大的Eden区+两块小的S区,将Eden存活对象放进其中一块S区,当S区空间不够,由老年代内存进行分配担保

Mark-Compact:标记整理(带压缩),让存活对象移动,解决内存碎片问题,但效率略低。

3、三色标记算法

并发情况下一边工作一边标记;把对象逻辑上分成三种类型(黑、白、灰),从GC Root上开始标记。白色:还未标记的对象,即要被回收的垃圾。

灰色:标记了对象,确认不是垃圾,但还未标记其成员变量。

黑色:标记了对象,确认不是垃圾,成员变量也标记完成。

​ 漏标问题:对于漏标的对象,即白色对象从灰色对象中断开引用,此时黑色对象引用了白色对象,此时从黑色对象开始标记,发现黑色不用往下标记,但白色对象虽然被黑色对象引用了,却不能变成灰色,此时进行回收,造成异常。由于并发阶段的存在,那就有可能在并行运行期间之前的标记过的对象的引用关系可能被改变,就会出现白对象漏标的情况,这种情况发生的前提是:把一个白对象的引用存到黑对象的字段里,如果这个情况发生,因为标记为黑色的对象认为是扫描完成的,不会再对它进行扫描。某个白对象失去了所有能从灰对象到达它的引用路径。对于第一个条件,在并发标记阶段,如果该白对象是new出来的,并没有被灰对象持有,那么它会不会被漏标呢?如果灰对象到白对象的直接引用或者间接引用被替换了,或者删除了,白对象就会被漏标,从而导致被回收掉,这是非常严重的错误。

​ CMS:三色标记用于并发标记阶段。对于漏标问题,CMS采用:Increamental Update,即将黑色标记变成灰色(黑+白=灰),但并发阶段,这种变色方式的标记会出现被其他线程修改的问题,导致了异常,这也是在1.9后CMS被废弃原因。

​ G1:三色标记称为STAB,Snapshot At Begining 初始化快照,通过对初始化标记放在栈中存储,被再次引用的对象从栈中拿出,剩余的被清理,因此不存在此类问题

​ ZGC:采用颜色指针,其类指针不再压缩是8字节即8*8=64位指针,18位空+4位颜色标记+42位对象 地址=64,因此2^42=4T,ZGC可以管理4T空间。

并发标记漏标问题处理方案:CMS:写屏障+增量更新

G1:写屏障+SATB

ZGC:读屏障

注:写屏障、读屏障就是类似AOP一样,写屏障是对赋值操作进行屏障切面,在这个切面加一些处理。

4、对象进入老年代大对象直接进入老年代,JVM参数设置:-XX:PretenureSizeThreshold=10000000(默认1M) -XX:+UseSerialGC

一次minorGC之后,幸存的对象survivor区存放不了。

经历过15次minorGC之后还存活(可设置进入老年代年龄)。

老年代内存担保分配机制:每次minorGc之前JVM会计算老年代剩余可用空间,若其小于年轻代所有对象之和。

查看是否有设置参数: -XX:HandlePromotionFailure (JDK1.8默认设置)。如设置

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值