什么时候会触发垃圾回收
在之前说到,当对象没人引用
导致新生代的内存占用越来越多,都快满了
这个时候,就会触发垃圾回收
被那些变量的引用的不能被回收
只要你的对象被方法的局部变量,类的静态变量给引用了就不会回收他们
JVM使用了一种可达性分析算法
用来分析对象被谁引用了
在JVM规范中,局部变量就是一个GC Roots
Java中不同的引用类型
强引用
只要是强引用,引用的类型,垃圾回收器,是不会回收这个对象的
软引用
正常情况下垃圾回收是不会碰这样的对象的
但是当垃圾回收之后,发现还是不足以存放新对象
才会把软引用回收掉
那怕被变量引用了
弱引用
如果发生垃圾回收,就会把这种给回收掉
虚引用
很少用
finalize()方法
有GC Roots引用的对象不能回收,没有GC Roots引用的对象可以回收,
如果有GC Roots引用,但是如果是软引用或者弱引用的,也有可能被回收掉。
假设没有GC Roots引用的对象,是一定立马被回收吗
其实不是的,这里有一个finalize()方法可以拯救他自己
假设有一个ReplicaManager对象要被垃圾回收了,那么假如这个对象重写了Object类中的finialize()方法
此时会先尝试调用一下他的finalize()方法,看是否把自己这个实例对象给了某个GC Roots变量,比如说代码中就给了ReplicaManager类的静态变量。
如果重新让某个GC Roots变量引用了自己,那么就不用被垃圾回收了。
很少使用