ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
### 垃圾标记算法 目前最常见的两种垃圾标记算法为引用计数算法和可达性分析算法\(根搜索算法\) * 引用计数算法\(Reference Counting\) * 可达性分析算法\(Reachability Analysis\) ##### 引用计数算法 对于创建的每一个对象都有一个与之关联的计数器,这个计数器记录着该对象被使用的次数,垃圾收集器在进行垃圾回收时,对扫描到的每一个对象判断一下计数器是否等于0,若等于0,就会释放该对象占用的内存空间,同时将该对象引用的其他对象的计数器进行减一操作 * 优点:实现简单,高效 * 缺点:**无法解决对象相互循环引用问题** * 当前主流JVM没有选用引用计数法来管理内存 ##### 可达性分析算法 算法的基本思路就是通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连(用图论的话来说,就是从GC Roots到这个对象不可达)时,则证明此对象是不可用的。如图3-1所示,对象object 5、object 6、object 7虽然互相有关联,但是它们到GC Roots是不可达的,所以它们将会被判定为是可回收的对象 ![](https://img.kancloud.cn/8a/15/8a1565f4fb35a6de4bac9d51e0c429da_950x447.png) #### ##### ##### JAVA中的GC Roots对象 * 虚拟机栈\(栈帧中的本地变量表\)中引用的对象 * 方法区类静态属性引用的对象 * 本地方法栈中的JNI\(即一般说的Native方法\)引用的对象 * 方法区中常量引用的对象 ![](https://img.kancloud.cn/ae/9a/ae9a90f8f2e847c09ccb60f54531769e_673x194.png) #### 内存碎片 一旦实例从堆内存中被删除,其位置就会变空并且可用于未来实例的分配。这些空出的空间将会使整个内存区域碎片化。为了实例的快速分配,需要进行碎片整理。基于垃圾回收器的不同选择,回收的内存区域要么被不停地被整理,要么在一个单独的GC进程中完成