Skip to content

Latest commit

 

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 

README.md

JVM基础

GC判定一个对象是否可回收

https://github.com/Lord-X/awesome-it-blog/blob/master/java/JVM-GC%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E7%AE%97%E6%B3%95-%E5%88%A4%E5%AE%9A%E4%B8%80%E4%B8%AA%E5%AF%B9%E8%B1%A1%E6%98%AF%E5%90%A6%E6%98%AF%E5%8F%AF%E5%9B%9E%E6%94%B6%E7%9A%84%E5%AF%B9%E8%B1%A1.md

可达性分析法

如何判断一个对象是否可达

  • 通过可达性分析该对象到GC Root不可达,如果不可达会进行第一次标记
  • 已经丧失“自救”机会,如果没有自救机会,会进行第二次标记,此时对象可回收

GC Root:由堆外指向堆内的引用

哪些GC Root

  • 代码中某一方法中的局部变量
  • 类变量(静态变量)
  • 常量
  • 本地方法栈中引用的对象
  • 已启动且未停止的线程

对象的自救

覆写了Object的finalize()方法,且GC还没有执行该对象的finalize()方法

当GC判定某一对象不再通过任一形式被引用时,GC会调用该对象的finalize方法。方法执行时,可以进行任何操作,包括将这个对象再次赋值给某一变量引用,但其主要目的还是做一些对象的清除操作。

其实在finalize方法中,只要将这个对象的引用(this)再次赋值给某一变量,这个对象就可以"自救"。

不同引用类型的回收

  • 强引用:任何时候都不会被回收,宁愿OOM也不会回收
  • 软引用:当JVM堆空间不足时,会被回收
  • 弱引用:GC时,只要发现弱引用对象,就会被回收
  • 虚引用:几乎和没有一样,随时可以被回收