对象引用与回收判断

1、引用计数算法:

         给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效计数器值就减1;任何时刻计数器都为0的对象就是不可能再被使用的。Java语言并没有选用引用计数器算法来管理内存,其中最主要的原因就是它很难解决对象之间相互循环引用的问题。

2、可达性分析算法

Java通过一系列的名为“GC Root”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连(用图论的话来说就是从GC Roots到这个对象不可达)时,则证明此对象是不可引用的,所以它们将会被判定为可回收对象。在Java语言中可作为GC Roots的对象包括下面几种:
虚拟机栈(栈帧中的本地变量表)中的引用的对象;
1)、 方法区中的类静态属性引用的对象;
2)、运行时常量池中的对象引用;
3)、方法区中的常量引用的对象;
4)、本地方法栈中JNI(即一般所说的native方法)引用的对象。

对象引用:JDK1.2之后,Java将引用分为四种,这四种引用强度依次逐渐减弱
强引用(Strong Reference):显示引用(例如:Object o = new Obje();),只要强引用还存在,垃圾收集器永远不会回收掉被引用的对象;
软引用(Soft Reference):有用但非必须的引用,当内存不足时, 此类引用的对象会被回收,jdk1.2之后提供了SoftReference类来实现;
弱引用(Weak Reference):非必须的引用,进行垃圾回收时,此类对象会被回收,jdk1.2之后提供了WeakReference类来实现;
虚引用(Plantom Reference):虚引用不对对象生存时间构成影响,无法通过此类引用获取对象实例,使用目的是对象被回收时收到一个系统通知,jdk1.2之后提供了PlantomReference类来实现。

3、生存还是死亡

要宣告一个对象死亡,至少要经历两次标记过程:
1)、如果可达性分析后没有与GC Roots相连接的引用链,会被第一次标记并进行一次筛选(筛选的条件是此对象有否有必要执行finalize()方法,当对象覆盖了finalize()方法并且该对象的finalize()方法被虚拟机调用过, 才有必要执行该对象的finalize()方法,任何对象的finalize()方法只会被被虚拟机调用一次。如果有必要执行该对象的finalize()方法,该对象将会被放置在F-Queue队列中,稍后由低优先级的Finalize线程去执行该对象的finalize()方法 ,finalize()方法是对象最后自我拯救的机会);
2)、之后GC将对F-Queue队列中的对象进行第二次小规模的标记,确定最终是否回收该对象。

4、回收方法区

方法区的垃圾回收性价比不高,主要回收废弃的常量和无用的类,回收常量与回收堆中的对象类似,回收无用的类需要类满足三个条件,而是否对类进行回收,虚拟机提供了-Xnoclassgc参数进行控制。
1)、该类所有的实例都已经被回收;
2)、加载该类的ClassLoader已经被回收,
3)、该类对应的java.lang.Class对象没有任何地方被引用,无法在任何地方通过反射访问该类的方法。

转载于:https://my.oschina.net/dslcode/blog/2999098

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值