JVM垃圾回收

JVM垃圾回收

GC原理
GC(Barbage Collection )垃圾回收原理:
将内存中不在被使用的对象进行回收,GC中回收方法称之为收集器,GC过程是需要消耗一些资源和时间的,考虑GC问题,为了竟可能的缩短GC对应用造成的停顿
• 对新生代的对象的收集称为minor GC
• 对老年代的对象的收集Full GC
• 用户通过System.gc()强制执行的GC为Full GC
不同的对象引用类型,GC会采用不同的方法进行会后,JVM对象的引用类型分为四种类型
强引用:默认情况,对象采用的均为强引用,这个对象的实例没有其他的对象引用,GC是才会被回收
软引用:软引用只有在内存不够用时才会被GC
弱引用:在GC时一定被GC回收
虚引用:只是用来得知对象是否被回收

对象被标记为垃圾的方法

引用计数法

引用计数法给堆中的每个对象实例都有一个引用计数。当一个对象被创建时,就给该对象分配一个变量,该变量的技术设置为1,当任何其他变量被赋予这个对象的引用时。计数加1,当一个对象的实例的某个引用超过生命周期或者是被设置为一个新值时,对象的应用计数器减1.任何引用计数器为0的对象实例可以被视为垃圾能够被垃圾回收器进行回收
优点:引用计数器可以很快执行,不会长时间的打断程序的实时执行
缺点:无法检测循环引用。
在这里插入图片描述
分析引用计数的问题:
在这里插入图片描述
在代码执行过程中:
step1:GCObject实例1的引用计数+1,实例1的引用计数=1
step2:GCObject实例2的引用计数+1,实例2的引用计数=1
step3:GCObject实例2的引用计数+1,实例1的引用计数=2
step3:GCObject实例1的引用计数+1,实例1的引用计数=2
接下来分析:
在这里插入图片描述
step5:帧栈中obj1不在指向java堆,GCObject实例1的引用计数-1,实例1的引用计数=1
step6:帧栈中obj2不在指向java堆,GCObject实例2的引用计数-1,实例2的引用计数=1
此时,GCObject的实例1和实例2计数都不为0,如果采用引用计数的方法,这两个实例对象就得不到释放,产生内存泄漏

可达性分析

程序中的引用关系看做一张图, 从一个节点 GC Roots开始,寻找对应的引用节点,找到这个节点后,继续寻找这个节点引用节点。当所有的阶段寻找完毕之后,剩余的节点则被认为是没有被引用的节点,即无用的节点,无用的节点被判定为回收的节点。
在Java语言中,可以作为GC root的对象包含下面几种
• 虚拟机栈中的引用对象(栈帧中的局部变量表)
• 本地方法栈中的JNI引用对象
• 方法区中的类静态变量引用的对象
• 方法区中常量的引用对象
在这里插入图片描述
在上图中,ref1、ref2、ref3都是GC Roots
对象实例1、2、4、6都是GCroots科大的,也就是存活对象,不能被GC进行回收,实例3、5虽然是直接相连,但是并没有任何一个GC Roots 与之相连,即GC Roots不可达,就回去被GC回收的对象

垃圾回收算法

标记-清除算法

标记-清除算法将回收对象的过程分为“标记”和“清除”两个阶段,首先标记所有需要回收的对象,在标记接收后统一回收所有被标记的对象
标记阶段:
标记的过程其实采用的可达性分析方法的过程,遍历所有的GC Roots对象,从GC Roots对象可达的对象都搭上一个标记,一般是在对象的header中,将其标记为可达对象
清除阶段:
清除的过程是对堆内存进行一个遍历,如果发现某个对象没有被标记为可达的对象(通过对象的header信息),则将其进行回收
在这里插入图片描述
注:在GC时,必须停止所有的Java执行线程(也称“Stop The World”),原因是在标记阶段进行可达性分析时,不可以出现分析过程中对象的引用关系还在不断的变化的情况。在等待标记清除结束后,应用程序才会恢复运行
标记/清除的算法的缺点:
• 空间碎片化问题
在标记清除之后产生大量的不连续的内存碎片。内存空间碎片太多可能导致后面程序运行过程中需要分配较大对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾回收
• 效率问题
标记和清除阶段的效率都不高,两个阶段都需要遍历内存中的对象,内存中对象的实例的数量是一般是很庞大的,这无疑很耗费时间,而且GC是需要停止应用程序,会导致非常差的用户体验。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值