堆和方法区的内存回收具有不确定性,因此垃圾收集器在回收堆和方法区内存的时候花了一点心思.
1 Java堆内存的回收
1.1 判定回收的对象
在对堆进行对象回收之前,首先要判断哪些是无效对象即一个对象不被任何对象或变量引用...yes,I am still alive :)
no,I am dead :(
3 方法区的内存回收
如果使用复制算法实现堆的内存回收,堆就会被分为新生代和老年代
新生代中的对象"朝生夕死",每次垃圾回收都会清除掉大量对象...该类所有实例都已被回收
即Java堆不存在该类的任何实例
加载该类的ClassLoader已被回收
该类的java.lang.Class对象没有被任何对象或变量引用,无法通过反射访问该类的方法
只要一个类被虚拟机加载进方法区...,那么在堆中就会有一个代表该类的对象:java.lang.Class.这个对象在类被加载进方法区的时候创建,在方法区中该类被删除时清除.
4 垃圾收集算法
知道了判定方法,也就知道了垃圾收集器会清除哪些数据...根据对象存活周期的不同将Java堆划分为老年代和新生代,根据各个年代的特点使用最佳的收集算法.