A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 孤尽 于 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(){}都能做




0 个回复

您需要登录后才可以回帖 登录 | 加入黑马