垃圾收集(GC)主要完成的三件事:
1.哪些内存需要回收
2.什么时候回收
3.如何回收
GC收集流程,如图:

CG器关注的内存
由于程序计数器、虚拟机栈、本地方法栈是随线程而生,随线程而灭,所以该部分的内存在线程结束或方法结束时就会被回收。而Java堆和方法区的内存分配和回收是动态的(因为只有在程序运行时,才会知道要创建哪些对象,需要多少内存),所以GC器关心的主要是这部分的内存。
如何判断对象存活或死去:
两种判断方法:引用计数算法和可达性分析算法
引用计数算法:给对象一个引用计算器,当有地方引用它时就加1,引用失效时就减1,当计算器为0时,对象就不能再被使用了。但该算法没有被JVM采用,因为它很难解决对象之间相互循环引用的问题。
可达性分析算法:就是通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连(用图论的话来说,就是从GC Roots到这个对象不可达)时,则证明此对象是不可用的。
Java语言中,GC Roots的对象包括: 虚拟机栈(栈帧中的本地变量表)中引用的对象、方法区中类静态属性引用的对象、方法区中常量引用的对象、本地方法栈中JNI(即一般说的Native方法)引用的对象。
本文详细解析了Java垃圾收集(GC)的核心任务,包括内存回收的判定、时机选择及回收方式。介绍了引用计数算法和可达性分析算法,并重点阐述了可达性分析算法的工作原理及其在Java中的应用。

346

被折叠的 条评论
为什么被折叠?



