1.程序的计数器,虚拟机栈,本地方法栈3个区域随线程而生,随线程而灭。
堆内的对象首先要判断是否还存活。
2.使用可达性分析算法,以一系列GC Roots对象为起点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明此对象不可用,这些堆对象将会被gc回收。
GC Roots的对象包括:
虚拟机栈、方法区中类静态属性引用对象、方法区中常量引用对象、本地方法栈中JNI引用对象。
3.当发现对象没有引用链时,会被标记一次并且会进行一次筛选是否有必要执行finalize()方法,如果被判断要执行会把这个对象放到一个叫F-Queue的队列之中并创建一个Finalizer线程去执行他。
4.回收方法区
主要回收废弃常量和无用的堆类。