【JVM篇】判断对象是否可回收

文章目录

      • 判断对象是否可回收的算法
      • 如何判断一个对象到底是生存还是死亡:
      • 元空间:
      • 引用:

【JVM篇】判断对象是否可回收_第1张图片

判断对象是否可回收的算法

1、引用计数算法:
	优点:
		实现简单;判定效率高。
		
	原理:	
		给对象添加一个引用计数器,有一个地方引用,计数器值加1;引用失效,计数器值减1。计数器值为0的对象不能使用。
		
	问题:		
		很难解决对象之间相互循环引用的问题。(两个相互引用的对象,但都和其他对象都没有引用)
		因为它们相互引用着对方,它们的引用计数都不为0,所以引用计数法无法回收它们。
			
2、可达性分析算法:
	原理:
		GC Roots作为起始点,从起始点向下搜索,搜索所走过的路径称为引用链。
		当一个对象到GC Roots没有任何引用链时,则证明此对象会被判定为可回收对象。		

如何判断一个对象到底是生存还是死亡:

1、在可达性分析算法中,判定不可达的对象;还不是真正死亡的。
	如果发现对象没有与GC Roots相连接的引用链,将进行第一次标记。随后进行一次筛选。
			
2、筛选条件:
	此对象是否有必要执行finalize()方法。
				
3、"没必要执行"的两种情况:
	(1)对象没有覆盖finalize()方法。
	(2)finalize()方法已经被虚拟机调用过
				
4、有必要执行:(将会进行第二次标记)
	该对象将被放在一个名为F-Queue的队列中;由虚拟机创建的finalizer线程执行finalize方法。
			
	如果在执行finalize方法时,对象能与引用链上的任何一个对象建立关联;(无论是否和引用链有关联)此时对象被移出队列。
			
5、被移出队列的对象:
	(1)在下一次GC的时候未和引用链上的任何一个对象建立关联,则此对象将被回收。
	(2)在下一次GC的时候和引用链上的任何一个对象建立关联,则此对象将不会被回收。

元空间:

1、回收废弃的常量和不再使用的类型。
		
2、判断一个类是否属于"不被再使用的类":
	(1)该类所有的实例都已经被回收;
	(2)加载该类的类加载器已经被回收;
	(3)该类对应的java.lang.Class对象没有任何地方被引用,无法在任何地方通过反射访问该类的方法。
		
3、判断一个对象被回收:
	一个字符串"java"进入常量池中,没有任何字符串对象引用常量池中的"java"常量;且虚拟机也没有其他地方引用。
	此时进行内存回收,且垃圾收集器判断有必要的话,这个"java"常量将会被系统清理出常量池。		

引用:

强引用:
	只要强引用还存在,垃圾收集器永远不会回收掉被引用的对象。
软引用:
	有用但并非必需的对象。
弱引用:
	述非必需对象。
虚引用:
	对象被收集器回收时收到一个系统通知。

你可能感兴趣的:(java)