java 如何判断对象是否是垃圾

发布时间 2023-04-14 13:43:25作者: HANGYCHN

引用计数法

给对象添加一个引用计数器,当对象增加一个引用时计数器加 1,引用失效时计数器减 1。引用计数为 0 的对象就是垃圾可被回收

比如 a 线程中某个栈帧使用某个对象,这个对象的引用计数器+1,调用结束,引用计数器-1

这个方法实现简单,效率高,但是并不可取,当循环引用时,引用计数器永远不会是0,就造成了内存泄漏

可达性分析算法

通过 GC Roots 作为起始点进行搜索,能够到达到的对象都是存活的,不可达的对象就是垃圾可被回收

可以作为 GC Root 的对象如下

  • 虚拟机栈中引用的对象
  • 本地方法栈中引用的对象
  • 方法区中类静态属性引用的对象
  • 方法区中的常量引用的对象

比如 a 线线程中栈帧1用了对象a,而对象a引用了对象b,a 就作为 GC Root,当线程存活时,b 对象就不会被回收>