初探jvm垃圾回收

两大类的垃圾回收

(一)引用计数收集器

引用计数收集器这个策略是早期的垃圾回收机制,在该策略中,我们会为堆中的对象都分配一个引用计数,当我们创建一个对象时,会为该对象分配一个引用计数,该引用计数设置为1,当我们将该对象的引用赋值给其他的引用变量时,该引用计数则加1(a=b这时我们是将b的引用赋值给a,所以b的引用计数加1),但是当一个对象的某个引用超过了他的生命周期或者被置为一个新值时,他的引用计数就会减1(a=b时,b加1,这时候我们在让a=c那么此时b的引用就会减1),当引用计数为0时,该对象就会被当做垃圾进行回收

(二)跟踪收集器

在早期的JVM中,我们用的是引用计数收集器,但是现在基本上都采用对象引用遍历,该方法是从一组对象开始,沿着对象图上的每一条链接,进行循环遍历,然后会进行判断某对象是否可以从这些跟对象中的至少一个到达,如果可以到达,GC会标记好这些垃圾对象,然后将未被标记的对象作为垃圾进行回收,跟踪收集器分为两步,第一步进行标记,第二步进行清除未被标记的对象

详解垃圾回收机制

要想弄明白垃圾回收机制,首先我们要先清除JVM都有什么,JVM由堆,栈,本地方法栈,方法区等部分组成
(1)堆
堆分为新生代和旧生代,而新生代又分为Eden和Survivor组成,而Survivor又是有FromSpace和ToSpace组成 ,所有的通过new创建的对象,都会在堆内存中分配内存
(2)栈
每个线程执行每个方法的时候都会在栈中申请一个栈帧,每个栈帧包括局部变量区和操作数栈,用于存放此次方法调用过程中的临时变量、参数和中间结果
(3)本地方法栈
用于支持本地native方法的执行
(4)方法区
存放了要加载的类信息、静态变量、final类型的常量、属性和方法信息。
JVM垃圾回收机制
(一)新生代垃圾回收机制
新生代GC:由于新生代用于存储存活时间比较短的对象,所以新生代我们采用Copying算法进行回收,也就是进行扫描对象,找到存活的对象,将其复制到一块新的不被使用到的区域,新生代采取空闲指针的方式来控制GC触发,即指针保持最后一个分配的对象在新生代区间的位置,当有新的对象要分配内存时,用于检查空间是否足够,不够就触发GC。当连续分配对象时,对象会逐渐从eden到survivor,最后到旧生代。
(二)旧生代垃圾回收机制
旧生代与新生代不同,对象存活的时间比较长,比较稳定,因此采用标记(Mark)算法来进行回收,所谓标记就是扫描出存活的对象,然后再进行回收未被标记的对象,回收后对用空出的空间要么进行合并,要么标记出来便于下次进行分配,总之就是要减少内存碎片带来的效率损耗
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值