1.如何判断对象可以回收

1.1 引用计数法

1.2可达性分析法

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

四种引用

深入理解java虚拟机之垃圾回收

  1. 强引用
    只有所有 GC Roots 对象都不通过【强引用】引用该对象,该对象才能被垃圾回收
  2. 软引用(SoftReference)
    仅有软引用引用该对象时,在垃圾回收后,内存仍不足时会再次出发垃圾回收,回收软引用对象可以配合引用队列来释放软引用自身
  3. 弱引用(WeakReference)
    仅有弱引用引用该对象时,在垃圾回收时,无论内存是否充足,都会回收弱引用对象可以配合引用队列来释放弱引用自身
  4. 虚引用(PhantomReference)
    必须配合引用队列使用,主要配合 ByteBuffer 使用,被引用对象回收时,会将虚引用入队,由 Reference Handler 线程调用虚引用相关方法释放直接内存
  5. 终结器引用(FinalReference)
    无需手动编码,但其内部配合引用队列使用,在垃圾回收时,终结器引用入队(被引用对象暂时没有被回收),再由 Finalizer 线程通过终结器引用找到被引用对象并调用它的 finalize方法,第二次 GC 时才能回收被引用对象

软引用Demo

深入理解java虚拟机之垃圾回收
深入理解java虚拟机之垃圾回收
深入理解java虚拟机之垃圾回收

弱引用Demo

深入理解java虚拟机之垃圾回收

垃圾回收算法

  • 标记清除 速度快,会产生碎片
    深入理解java虚拟机之垃圾回收
  • 标记整理 速度慢,不会产生碎片
    深入理解java虚拟机之垃圾回收
  • 复制 不会有内存碎片 需要占用双倍内存空间
    深入理解java虚拟机之垃圾回收

相关文章: