GC:
常用方法有引用计数和可达性分析。现在JAVA内部是不用引用计数的。
对于可达性分析会枚举GC roots,如果对象没有指向任何一条roots链,则会被标记,面临被清除的可能。如果该对象想拯救自己,那么它就需要执行一次finalize()。在finalize()中将自己引用于gc roots上对象相关联。要执行finalize()需要对象覆盖了finalize()方法,并且虚拟机没有执行过finalize()。执行了finalize(),也不一定不会被清理。
GC roots:
虚拟机栈中引用的对象
本地方法栈中引用的对象
方法区中静态属性
方法区中常量属性
虚拟机在执行遍历GC roots时候,会挂起所有线程,造成程序停顿。而每当进行full gc时,会进行遍历。这时就要求程序合理编码,减少full gc次数。
垃圾收集算法:
标记-清除
复制
标记-整理
分代收集