jvm -垃圾回收概述

那些内存需要回收,什么时候回收,怎么回收?

1,没有引用指向它时候,这段内存就可以回收了,这是一般看法,所以可以设置一个程序对象的引用计数器,当等于0的时候就回收。但是这个是有问题的。可达性分析:判断对象是否存活,算法的思想搜通过一系列可以作为gc-root的对象作为起始点,从起始点开始向下搜索,经过的路径叫引用链,如果一个对象到gc-root没有引用链的时候就可以回收了。可以作为gc-root 的对象有有以下几种:

虚拟机栈中引用的对象,方法区中静态属性引用的对象,方法区中常量引用的变量,本地方法栈中的native方法引用的对象。

2,引用:强引用(new出来的是强引用),软引用(有用,但是不是必须的,就像是鸡肋,弃之可惜。内存发生溢出之前释放的引用,如果释放之后还是不够才会抛出异常),弱引用(非必须的对象,只能活到下次垃圾回收之前),虚引用(无法通过这个引用得到一个对象,存在的唯一目的是在系统回收对象的时候收到通知)

3,需要finalize的对象先放在F-queue队列里面,等待执行,如果在等待的期间又有引用了,此时就移除队列,否则就相当于回收了。F-queue就相当于回收站。

方法区也是有回收的:回收无用的类和废弃的常量。只是在新生代的垃圾回收通常会回收大概百分之70-95,但是老生代中回收的比例低。

4方法:

标记-清除:标记出来finalize(),后面找机会清除。问题:导致内存碎片化。

复制:当一块内存用完了的时候,将还存活的复制到另外一块内存上,清空该内存块。问题:当存活着的对象过多的时候,占用内存可能过大。

标记—整理:将存活的对象移到一端,剩下的内存清空。

分代处理方法:新生代和老生代。新生代:复制(因为存活的对象较少),老生代:标记-清除,标记-整理方法。因为它存活的比例比较高。

hotspot算法:

首先枚举根节点:用的是准确是GC:当类加载完后用oopmap来记录那些地方存在对象的引用。但是hotspot并没有为所以的指令生成oopmap,因为这样太浪费空间,只在特定的位置记录了这些信息。这些信息成为安全点(safepoint),符合safepoint的特点的是“是否具有让程序长时间的执行”这个特征,即是否是方法调用,循环跳转,异常跳转等。当程序执行这些功能的时候,我们就执行gc。为什么,就相当于你洗衣服的时候开会看电视一样。gc的时候要让所有的线程都跑到安全点上有两种方法:主动式中断和抢断式中断。主动式是先让所有的停下里,查看如果有谁不在安全点就激活这个线程,让它运行到safepoint。抢断式是设置一个safepoint,线程执行时会查看是否在safepoint如果在则停下来。

但是safepoint也不能解决所有的问题,如果线程sleep了怎么办,此时有个saferegion(在这个区域中引用关系不发生变化)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值