关于 Java 的垃圾收集( Garbage Collection,GC ),Java 运行时区域的各个部分,程序计数器、虚拟机栈、本地方法栈 3 个区域随线程而生,随线程而灭;栈中的栈帧随着方法的进入和退出而有条不絮的执行者岀栈和入栈操作。
每个栈帧中分配多少内存基本上实在类结构确定下来时就已知的,因此在这几个区域内存的分配和回收都具有确定性,就不需要过多考虑回收的问题,因为在方法结束或者线程结束时,内存就自然跟着回收了。既然 Java 的内存回收已经如此智能,我们为什么还有继续了解 GC 和内存分配呢?
在可达性分析算法中不可达的对象,也并非是“非死不可”的,一个对象死亡,至少要经历两次标记过程:如果对象在进行可达性分析后发现没有与 GC Roots 相连接的引用链,那它将会被第一次标记并且进行一次筛选,筛选的条件是此对象是否有必要执行 finalize ( )
方法。当对象没有覆盖 finalize ( )
方法,或者 finalize ( )
方法已经被虚拟机调用过,虚拟机将这两种情况都视为“没有必要执行”。
Java 虚拟机规范中对垃圾收集器应该如何实现并没有任何规定,因此不同的厂商、不同版本的虚拟机所提供的垃圾收集器都可能会有很大差别,并且一般都会提供参数供用户根据自己的应用特点和要求组合出各个年代所使用的收集器。下面是 JDK 1.7 Update 14之后的 HotSpot 虚拟机包含的所有收集器: