欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

什么情况下JVM内存中的一个对象会被垃圾回收?

程序员文章站 2022-05-18 18:47:21
新生代满了会触发 Young GC,老年代满了会触发 Old GC。GC时会回收对象,那么具体是什么样的对象会被垃圾回收器回收呢? ......

新生代满了会触发 young gc,老年代满了会触发 old gc。gc时会回收对象,那么具体是什么样的对象会被垃圾回收器回收呢?

  1. 可达性分析算法,判断是否被 gc roots 引用
  2. 判断引用类型:强引用、软引用、弱引用、虚引用
  3. 是否调用finialize()方法自救

首先,jvm 会通过可达性分析算法来判断哪些对象会被回收,哪些不会被回收。可达性分析算法会从一个对象触发,一层层向上,分析有谁在引用它,看是否有一个 gc roots

被 gc roots 引用的对象就不会被垃圾回收。gc roots 指的是局部变量,或者类的静态变量。具体可以看这篇文章:什么是被 gc roots 直接引用的对象?

其次,看引用类型。java中有强引用、软引用、弱引用和虚引用:

  • 强引用,被强引用的对象不会被回收
  • 软引用,被软引用的对象一般并不会被回收,gc之后内存任然不够会被回收
  • 弱引用,弱引用就像没有被引用,gc时直接回收
  • 虚引用,很少用到需引用,可以忽略

所以总的来说:

  1. 有 gc roots 的对象不能回收,没有 gc roots 的对象可以回收
  2. 有 gc roots 的对象,如果是软引用或者弱引用,也有可能被回收

最后,一个对象没有被 gc roots 引用,是否立即就会被回收呢?

也不一定立即被回收,该类可以重写finialize()方法,在finialize()中让一个 gc roots 重新引用这个对象,就能自救。