JVM垃圾回收

如何判断对象可以回收

引用计数法

只要一个对象被其他对象引用,那就将这个计数器+1,引用两次就+2,如果不在引用了就-1。当这个对象的计数为0,就代表这个对象没人引用了,就可以进行垃圾回收。

但是这个有一个弊端,就是容易产生循环引用的问题。比如A、B对象循环引用,这个两个对象计数都是1,但这两个对象没有被其他对象引用,按理说都是没用的应该被回收,可却达不到计数是0的条件。

可达性分析算法

首先确定一系列根对象(肯定不能当成垃圾回收的对象),垃圾回收之前,会对堆中所有的对象进行扫描,看看是不是被根对象直接或间接引用,如果是则不能被回收,反之可以被垃圾回收

  • Java虚拟机中的垃圾回收器采用可达性分析来探索所有存活的对象
  • 扫描堆中的对象,看是否能够沿着GC Rooti对象为起点的引用链找到该对象,找不到,表示可以回收

四种引用

1.强引用

  • 只有所有GC Roots对象都不通过【强引用】引用该对象,该对象才能被垃圾回收

2.软引用(SoftReference)

  • 仅有软引用引用该对象时,在垃圾回收后,内存仍不足时会再次出发垃圾回收,回收软引用对象

  • 可以配合引用队列来释放软引用自身

3.弱引用(eakReference)

  • 仅有弱引用引用该对象时,在垃圾回收时,无论内存是否充足,都会回收弱引用对象

  • 可以配合引用那队列来释放弱引用自身

4.虚引用(PhantomReference)

  • 必须配合引用队列使用,主要配合ByteBuffer使用,被引用对象回收时,会将虚引用入队,由Reference Handler线程调用虚引用相关方 法释放直接内存

5.终结器引用(FinalReference)

  • 无需手动编码,但其内部配合引用队列使用,在垃圾回收时,终结器引用入队(被引用对象暂时没有被回收),再由Finalizer线程通过终结器引用找到被引用对象并调用它的finalize方法,第二次GC时才能回收被引用对象
posted @   Cloong  阅读(21)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示