判断垃圾的算法一般用引用计数法和可达性分析算法。
可达性分析算法中的Gc Root一般是虚拟机栈中引用的对象,方法区中的静态属性或常量引用的对象,本地方法栈中(Native方法)引用的对象。
垃圾回收算法有三种,标记清除算法、标记整理算法和复制算法。
大部分初始new的对象分配在eden空间,在eden空间中垃圾比较多,为了提高效率,使用复制算法,经过一次MinorGC后,对象存储到Suvivor空间中;大对象和长期存活的对象(年龄超过默认值15;Survivor区中相同年龄的所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象)直接进入老年代,老年代的垃圾会受算法使用标记清除算法或者标记整理算法。
MinorGC发生在新生代,MajorGC发生在老年代,FullGC发生在堆空间(包括新生代和老年代),FullGC与MajorGC等价。
Minor GC触发条件:Eden区满时
Full GC触发条件:
(1)调用System.gc时,系统建议执行Full GC,但是不必然执行
(2)老年代空间不足
(3)永久代空间不足