当前位置: 首页 > 面试题库 >

Java:怎么判断对象是否可以被回收?

谷永贞
2023-04-24

1、引用计数算法

(1)判断对象的引用数量

通过判断对象的引用数量来决定对象是否可以被回收;
每个对象实例都有一个引用计数器,被引用+1,完成引用-1;
任何引用计数为0的对象实例可以被当做垃圾回收;

(2)优缺点

优点:执行效率高,程序受影响较小;
缺点:无法检测出循环引用的情况,导致内存泄漏;

2、可达性分析算法

通过判断对象的引用链是否可达来决定对象是否可以被回收。

如果程序无法再引用该对象,那么这个对象肯定可以被回收,这个状态称为不可达。

那么不可达状态如何判断呢?

答案是GC roots,也就是根对象,如果一个对象无法到达根对象的路径,或者说从根对象无法引用到该对象,该对象就是不可达的。

以下三种对象在JVM中被称为GC roots,来判断一个对象是否可以被回收。

(1)虚拟机栈的栈帧

每个方法在执行的时候,JVM都会创建一个相应的栈帧(操作数栈、局部变量表、运行时常量池的引用),当方法执行完,该栈帧就从栈中弹出,这样一来,方法中临时创建的独享就不存在了,或者说没有任何GC roots指向这些临时对象,这些对象在下一次GC的时候便会被回收。

(2)方法区中的静态属性

静态属性数据类属性,不属于任何实例,因此该属性自然会作为GC roots。这要这个class在,该引用指向的对象就一直存在,class也由被回收的时候。

class何时会被回收?

  1. 堆中不存在该类的任何实例
  2. 加载该类的classLoader已经被回收
  3. 该类的java.lang.class对象没有在任何地方被引用,也就是说无法通过反射访问该类的信息

(3)本地方法栈引用的对象

 类似资料:
  • 本文向大家介绍怎么判断对象是否可以被回收?相关面试题,主要包含被问及怎么判断对象是否可以被回收?时的应答技巧和注意事项,需要的朋友参考一下 一般有两种方法来判断: 引用计数器:为每个对象创建一个引用计数,有对象引用时计数器 +1,引用被释放时计数 -1,当计数器为 0 时就可以被回收。它有一个缺点不能解决循环引用的问题; 可达性分析:从 GC Roots 开始向下搜索,搜索所走过的路径称为引用链。

  • 一、引用计数法 给对象添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器为0的对象就是不可能被再使用的。 主流的JVM里面没有选用引用计数算法来管理内存,其中最主要的原因是它很难解决对象间的互循环引用的问题。 二、可达性分析算法 通过一些列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象

  • 本文向大家介绍GC中如何判断对象是否需要被回收?相关面试题,主要包含被问及GC中如何判断对象是否需要被回收?时的应答技巧和注意事项,需要的朋友参考一下 考察点:JAVA虚拟机 即使在可达性分析算法中不可达的对象,也并非是“非回收不可”的,这时候它们暂时处于“等待”阶段,要真正宣告一个对象回收,至少要经历两次标记过程:如果对象在进行可达性分析后发现没有与GC Roots相连接的引用链,那它将会被第一

  • 本文向大家介绍html5怎么判断app是否安装?相关面试题,主要包含被问及html5怎么判断app是否安装?时的应答技巧和注意事项,需要的朋友参考一下 例如,打开微信 是用了微信自己的 wechat://xxxx 这样类似http/https的协议,来打开。支付宝是alipay,其他的应用都有不同的自己的协议头,通过这样的链接来唤醒APP。如果打不开就能判断是否安装该APP

  • 本文向大家介绍html5怎么判断是否在wifi环境?相关面试题,主要包含被问及html5怎么判断是否在wifi环境?时的应答技巧和注意事项,需要的朋友参考一下 https://developer.mozilla.org/en-US/docs/Web/API/Network_Information_API

  • 问题内容: 因此,这里的问题非常简单:是否可以判断Java中是否存在Interin?我的猜测不是,但是我想知道是否有人知道更好。 问题答案: 找出a 是否被拘禁的唯一方法是调用并检查其是否返回: 显然,这有一个缺点,那就是以前没有进行过intern的时间。 部分去题外话,有办法做“定制”与使用显式泳池实习接口的番石榴(利用暴露的实现类)。这样做的好处是,当不再引用自身(因此也就是池)时,便可以对其