JVM-垃圾回收算法(垃圾判定算法)

在进入JVM的GC机制之前我们需要先了解一些常见的垃圾判断算法以及垃圾回收算法,先对这些算法有个清晰的认知,再去了解JVM各个垃圾回收器是怎么使用这些算法进行GC的落地的。

常见的垃圾判断算法有两种:引用计数法可达性分析算法

常见的垃圾回收算法/理论有这几大类:标记清除算法,标记复制算法,标记整理算法,分代收集算法。

引用计数法

概述

所谓引用计数就是在这个对象信息中有一个专门的空间专门用于记录:其他引用或者其他对象对自己的指向次数

如果该对象的这个计数为0,就可以判断这个对象是个垃圾对象。

图解

在这里插入图片描述

如图所示:

栈中的一个对象引用指向了堆中对象A,因此对象A的计数器为1

堆中的对象B,由于被对象A依赖又算上对象A被栈中引用指向,因此对象B的计数为2。

特点

优势

  • 不会产生STW,可以立即回收垃圾。因为每个对象在被引用次数为0的时候,是立即就可以知道的,因此不需要额外开启一个GC线程进行垃圾回收,因此可以避免STW。
  • 实现简单。

劣势

  • 致命问题:对于循环依赖没办法进行垃圾判断,最终导致内存泄漏。
  • 对于长链接引用的计数不方便,例如上述图中的B的计数需要递归到引用A(),最终才能得出正确的引用结果2。

循环引用图解

在这里插入图片描述

如图所示:

这里的对象A和对象B互相依赖因此计数器的值都是1。

此时无论是对象A还是对象B,都没有外部的引用指向它们了,也就是说它们因该是垃圾对象了。

由于引用计数算法中只有计数器值为0才会被判定为垃圾,这两个对象也就不会被GC回收,造成内存泄漏,最终导致OOM。

可达性分析算法

概述

可达性分析算法的流程是:

  1. 先找出JVM中的GC Root对象
  2. 然后从GC Root对象开始根据依赖关系遍历依赖的对象并给这些对象打上标记;
  3. 当所有根据GC Root对象遍历的对象标记完后。堆中剩余的其他未被标记的对象就是垃圾对象。

GC ROOT对象

概述中出现一个新的名词:GC ROOT对象,这里稍微解释一下。在JVM中GC ROOT对象往往指代以下几种对象:

  • 类加载器对象。
  • Thread对象。
  • 虚拟机栈的本地变量表中的对象引用指向的对象。
  • static成员变量引用的对象。
  • 常量引用的对象。
  • 本地方法栈的变量引用的对象。
  • 本地方法栈中JNI(即一般说的Native方法)引用的对象。

图解在这里插入图片描述

如图所示:

绿色对象就是被GC ROOT引用的对象,因此不是垃圾对象。

红色对象没有和任何GC ROOT关联,因此都是垃圾对象。

特点

优势

  • 主要解决的,引用计数算法无法堆循环依赖对象的垃圾判断,避免了JVM层面会出现内存泄漏的问题。

劣势

  • 产生了STW,相对于引用计数算法,对系统的开销更大。

由于可达性分析算法的流程比引用计数算法的流程复杂,往往需要新开一个GC线程专门用于垃圾检测和回收。

为了避免遍历对象时的误判情况发生,此时需要暂停工作线程,因此会导致STW。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
JVM垃圾回收是Java虚拟机的一个重要功能,它的知识体系包括以下内容: 1. 垃圾回收算法垃圾回收算法是指垃圾回收器采用的垃圾回收策略。常见的垃圾回收算法包括标记-清除、复制、标记-压缩和分代等。 2. 垃圾回收器:垃圾回收器是JVM的一个组成部分,它负责执行垃圾回收算法,并回收Java对象的内存空间。常见的垃圾回收器包括Serial、Parallel、CMS、G1等。 3. 对象存活判定垃圾回收器需要判断哪些Java对象是可以回收的,哪些是必须保留的。存活对象可以通过引用计数、可达性分析等方式判断。 4. 垃圾回收的过程:垃圾回收的过程包括标记、清除、整理等阶段。标记阶段是找到存活对象的过程,清除阶段是回收无用对象的过程,整理阶段是将存活对象移动到一块连续的内存区域中。 5. 垃圾回收的性能优化:垃圾回收的性能优化包括分代、增量、并发、预处理等技术。分代是指将Java对象分为年轻代和老年代,以便针对不同的对象有针对性地进行垃圾回收。 6. 垃圾回收的调优和监控:垃圾回收的调优和监控可以通过调整堆大小、设置垃圾回收器类型、调整垃圾回收的参数等方式实现。 JVM垃圾回收是Java虚拟机的一个重要功能,掌握其知识体系可以帮助程序员更好地理解Java程序的内存模型和垃圾回收机制,从而编写出高效、可靠的Java程序。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值