对象是否存活和引用分类

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mozha_666/article/details/82529243

垃圾收集器所关注的内存是java堆,和方法区
1、判断对象是否存活?
1)引用计数法:给对象添加一个计数器,当有一个地方引用它就计数器加1,当引用失效计数器减1,当计数器为0表示这个对象不能再被使用,引用计数法实现简单但是他很难解决对象之间互相循环引用的问题
2)可达性分析算法:这个算法的基本思想是通过一系列的GCRoot对象做为起始点,从这些节点开始向下搜索,搜索所走过的路径就称为引用链,当一个对象到GCRoot没有引用链相连就说明对象不可达
a、那么有哪些对象可以做为GCRoot?
虚拟机栈中引用的对象
方法区类静态属性引用的对象
方法区中常量引用对象
本地方法栈引用的对象
3、引用:不管是引用计数法还是可达性算法都涉及到对象引用,那什么是引用
1)从传统定义上讲,如果reference类型中的存储的数值代表另一块内存的起始地址,但是这种定义太过狭义,我们有另外一种定义
2)我们将引用分为强引用,软引用,弱引用,虚引用,各自有什么区别
a、强引用:比如 obj = new Object()这个就是强引用,垃圾收集器永远不会回收掉被强引用的对象
b、软引用:描述一些还有用但是非必须的对象,在将要OOM之前,会对这些对象进行二次回收,如果这次回收内存还是不够,就会抛出内存溢出异常,JDK中提供softReference类来实现软引用
c、弱引用:被引用对象只能生存到下一次垃圾收集之前无论内存是否够用都会被回收掉,JDK提供了weakReference类来实现弱引用
d、虚引用也叫幽灵引用或幻影引用,最弱的一种引用关系,无法通过虚引用来获取一个对象实例,为一个对象设置虚引用是为了能在这个对象被收集器回收时收到一个系统通知,JDK通过PhantomReference类来实现虚引用

猜你喜欢

转载自blog.csdn.net/mozha_666/article/details/82529243