JVM是运行Java字节码的程序,为Java程序提供了底层实现无关的平台。Java对象的内容放在堆内存中,在垃圾收集器(Garbege Collector)对堆内存进行回收前,会先判断哪些对象还在“存活”,哪些对象已经“死去”(即不可能再被任何途径使用的对象),这些“死去”的对象,就是我们需要进行回收的垃圾。
现在的Java采用可达性分析算法来判定哪些内存是垃圾。这个算法的思想就是,通过一系列被称为“GC Roots”的对象作为起点,然后向下搜索,所走过的路径被称为引用链。当一个对象到 GC Roots之间没有任何引用链时(即从GC Roots到该对象不可达),则证明该对象是不可用的。这个算法解决了循环引用的问题,只要对象无法与GC Root之间建立直接或间接的连接,就会判定为可回收对象。
可作为GC root的对象有以下几种:
一、虚拟机栈(栈帧中的本地变量表)中引用的对象。
二、方法区中类静态属性引用的对象。
三、方法区中常量引用的对象。
四、本地方法栈中引用的对象。