方法区中能回收的内容主要就是不再使用的类。(注意类 不是对象)
判定一个类可以被卸载。需要同时满足下面三个条件:
1、此类所有实例对象都已经被回收,在堆中不存在任何该类的实例对象以及子类对象。
2、加载该类的类加载器已经被回收。
3、该类对应的java.lang.Class对象没有在任何地方被引用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| public class classUnload public static void main(Stringll args)throws InterruptedException { try { ArrayList<Class<?>> classes = new ArrayList<>(); ArrayList<URLClassLoader> loaders= new ArrayList<>(); ArrayList<Object> objs =new ArrayList<>(); while(true){ URLClassLoader loader = new URLClassLoader(new URL[]{new URL("file:D:\lib\");}); Class<?> clazz = loader.loadClass("com.itheima.my.A"); Obiect o = clazz.newInstance(); //objs.add(o); //classes.add(clazz); //Loaders.add(loader); //以上三行若执行的话 就不满足三个条件 则该类com.itheima.my.A也不会被回收 System.gc();//告诉虚拟机要回收垃圾了 }
|
开发中此类场景一般很少出现,主要在如 OSGi、JSP 的热部署等应用场景中
每个jsp文件对应一个唯一的类加载器,当一个jsp文件修改了,就直接卸载这个jsp类加载器。
重新创建类加载器,重新加载jsp文件