重点关注几个问题:
-对象已死吗?
采用引用计数法(不能解决相互循环引用问题)或可达性分析法。
引用计数法:计算对象的引用数,计数为0时对象被回收。
可达性分析:通过一系列的"GC Roots"的对象(如栈中引用的对象、方法区中类静态属性引用的对象、常量引用的对象)作为起始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连(不可达),则这些对象时不可用的。
-方法区中的回收
主要针对废弃的"常量"(程序中没有对象叫做“ab”,那常量池中"ab"将会被回收)和无用的类进行回收。
所谓无用的类,必须满足以下条件:
1、堆中不存在该类的任何实例2、加载该类的类加载器已经被回收3、该类对应的Class对象没有在任何地方被引用,即无法再任何地方通过反射访问该类的方法。
在大量使用反射、动态代理、CGLib等ByteCode框架、动态生成jsp这类频繁自定义ClassLoader的场景都需要虚拟机具备类卸载功能以保证不会发生内存溢出。(至于类是否会被虚拟机回收,需要设置虚拟机参数-Xnoclassgc,以上三点只是必要条件)
时间: 2024-10-13 21:21:45