黑马程序员技术交流社区

标题: 【上海校区】什么情况下JVM内存中的一个对象会被垃圾回收 [打印本页]

作者: 孤尽    时间: 2019-8-25 11:43
标题: 【上海校区】什么情况下JVM内存中的一个对象会被垃圾回收
本帖最后由 孤尽 于 2019-8-25 11:47 编辑

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




被那些变量引用的对象是不能回收的?


JVM使用了一种
可达性分析算法来判断那些对象是可以被回收,那些对象是不能被回收
这个算法的意思,就是说对每个对象,都分析一下有谁在引用他,然后一层一层往上判断,看是否有一个GC Roots.
在JVM规范中,局部变量就是可以作为GC Roots的
静态变量也可以看做是一种GC Roots ,此时只要一个对象被GC Roots引用了,就不会回收他


java中不同的引用类型?


强引用:一个变量引用一个对象,只要是强引用的类型,那么垃圾回收的时候绝对不会去回收这个对象


软引用:SoftReference软引用类型的对象包裹起来的实例对象,此时变量对对象的引用就是软引用,正常情况下垃圾回收是不会回收软引用对象的,但是如果进行垃圾回收之后,发现内存空间还是不够存放新的对象,内存都快溢出了,此时就会把软引用的对象给回收掉,哪怕他被变量引用了。

弱引用:被WeakReference包裹的实例对象,如果发生垃圾回收,就会把这个对象给回收掉。

虚引用:PhantomReference


finalize()方法的作用:到了回收的阶段,假设没有GC Roots引用的对象,是一定立马被回收吗?还有一个finalize()方法可以拯救他自己


回收之前会调用finalize()方法,如果把自己这个实例对象重新赋值给某个GC Roots变量,重新引用了自己,就不会被垃圾回收。
意义不大,基本不会用,他能做的try{}catch(){}都能做









欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2