JVM垃圾回收
如何判断对象可以回收
引用计数法
只要一个对象被其他对象引用,那就将这个计数器+1,引用两次就+2,如果不在引用了就-1。当这个对象的计数为0,就代表这个对象没人引用了,就可以进行垃圾回收。
但是这个有一个弊端,就是容易产生循环引用的问题。比如A、B对象循环引用,这个两个对象计数都是1,但这两个对象没有被其他对象引用,按理说都是没用的应该被回收,可却达不到计数是0的条件。

可达性分析算法
首先确定一系列根对象(肯定不能当成垃圾回收的对象),垃圾回收之前,会对堆中所有的对象进行扫描,看看是不是被根对象直接或间接引用,如果是则不能被回收,反之可以被垃圾回收
- Java虚拟机中的垃圾回收器采用可达性分析来探索所有存活的对象
- 扫描堆中的对象,看是否能够沿着GC Rooti对象为起点的引用链找到该对象,找不到,表示可以回收
四种引用
1.强引用
- 只有所有GC Roots对象都不通过【强引用】引用该对象,该对象才能被垃圾回收
2.软引用(SoftReference)
-
仅有软引用引用该对象时,在垃圾回收后,内存仍不足时会再次出发垃圾回收,回收软引用对象
-
可以配合引用队列来释放软引用自身
3.弱引用(eakReference)
-
仅有弱引用引用该对象时,在垃圾回收时,无论内存是否充足,都会回收弱引用对象
-
可以配合引用那队列来释放弱引用自身
4.虚引用(PhantomReference)
- 必须配合引用队列使用,主要配合ByteBuffer使用,被引用对象回收时,会将虚引用入队,由Reference Handler线程调用虚引用相关方 法释放直接内存
5.终结器引用(FinalReference)
- 无需手动编码,但其内部配合引用队列使用,在垃圾回收时,终结器引用入队(被引用对象暂时没有被回收),再由Finalizer线程通过终结器引用找到被引用对象并调用它的finalize方法,第二次GC时才能回收被引用对象

浙公网安备 33010602011771号