浅析JVM垃圾回收的过程

 更新时间:2020年09月01日 10:57:50   作者:pinxiong  
这篇文章主要介绍了JVM垃圾回收的过程,帮助大家更好的理解和学习Java中的垃圾回收机制,感兴趣的朋友可以了解下

JVM垃圾回收的算法很多,但是不管是哪种算法,在进行GC时大致的流程都是差不多的,主要有以下3个过程:

1. 枚举根节点

这个过程主要是找到所有的GC Roots对象,这些对象一般发生在JVM虚拟机栈栈帧、常量池中的静态对象、方法区中静态类属性引用、本地方法栈中引用的对象。这个过程会发生STW,所有的线程均运行到安全区域(Safe Region)才开始执行。

通常有两种算法:

  • 引用计数法:每个对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就+1;当引用失效时,计数器值就-1;任何时刻计数器为0的对象就是不可能在被使用的。

优点是效率高,缺点是循环引用无法处理,导致内存溢出。

  • 可达性分析:以GC Roots为根节点,从这些根节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象不在任何引用链相连时,则证明此对象是不可用的。

优点可以检测所有的对象,缺点效率低。

GC Roots节点一般为:

  • 虚拟机栈中栈帧引用的对象
  • 本地方法栈JNI中栈帧引用的对象
  • 常量池中引用的对象
  • 类中的静态变量应用的对象

2. 标记

标记的过程主要是标记哪些对象是需要被回收的,有的GC算法是并行的,有的是和GC Roots标记一起执行。如果是并行的,不会发生STW。

如果是并发标记的GC算法,后面还有有一次重新标记或者最终标记。这主要是来解决在并发标记的过程中,用户线程还在一直执行,这期间有变化的对象。

标记算法常见的有两种:

  • 标记–清除算法或者标记–整理算法:为每个对象存储一个标记位,记录对象的状态(活着或是死亡)
  • 复制算法:将内存平均分成两部分,然后每次只使用其中的一部分,当这部分内存满的时候,将内存中所有存活的对象复制到另一个内存中,然后将之前的内存中死亡的对象清空。

3. 清除或回收

这个阶段会根据GC算法的不同采取不同的回收策略。

  • CMS算法在回收的时候会考虑停顿时间,尽量减少GC线程占用的时间
  • G1算法先对各个Region的回收价值和成本进行排序,根据用户所期望的GC停顿时间来制定回收计划
  • 标记-清除算法在第二阶段(清除阶段)将对象回收
  • 复制算法是通过将存活对象复制到另一块内存区域,将当前区域中未被复制的对象进行清除

以上就是浅析JVM垃圾回收的过程的详细内容,更多关于JVM垃圾回收的资料请关注脚本之家其它相关文章!

相关文章

  • Java中TypeReference用法详情说明

    Java中TypeReference用法详情说明

    这篇文章主要介绍了Java中TypeReference用法详情说明,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-07-07
  • Spring Cloud Gateway 拦截响应问题分析(数据截断问题)

    Spring Cloud Gateway 拦截响应问题分析(数据截断问题)

    这篇文章主要介绍了Spring Cloud Gateway 拦截响应问题分析(数据截断问题),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-01-01
  • SpringBoot解析自定义yml文件的流程步骤

    SpringBoot解析自定义yml文件的流程步骤

    这篇文章主要介绍了SpringBoot解析自定义yml文件的流程步骤,文章通过代码示例和图文结合的方式给大家介绍的非常详细, 对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-06-06
  • 聊聊java多线程创建方式及线程安全问题

    聊聊java多线程创建方式及线程安全问题

    线程被称为轻量级进程,是程序执行的最小单位,它是指在程序执行过程中,能够执行代码的一个执行单位。接下来通过本文给大家介绍java多线程创建方式及线程安全问题,感兴趣的朋友一起看看吧
    2022-01-01
  • 浅谈java面向对象中四种权限

    浅谈java面向对象中四种权限

    这篇文章主要介绍了浅谈java面向对象中四种权限,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • java虚拟机学习笔记进阶篇

    java虚拟机学习笔记进阶篇

    在本篇内容里小编给大家分享了关于java虚拟机学习笔记的进阶内容,需要的朋友们跟着学习下。
    2019-06-06
  • 如何使用Springfox Swagger实现API自动生成单元测试

    如何使用Springfox Swagger实现API自动生成单元测试

    Springfox是一个使用Java语言开发开源的API Doc的框架,它的前身是swagger-springmvc,可以将我们的Controller中的方法以文档的形式展现,这篇文章主要介绍了如何使用Springfox Swagger实现API自动生成单元测试,感兴趣的朋友跟随小编一起看看吧
    2024-04-04
  • 深入了解volatile和Java内存模型

    深入了解volatile和Java内存模型

    在本篇文章当中,主要给大家深入介绍Volatile关键字和Java内存模型。在文章当中首先先介绍volatile的作用和Java内存模型,然后层层递进介绍实现这些的具体原理、JVM底层是如何实现volatile的和JVM实现的汇编代码以及CPU内部结构,感兴趣的可以了解一下
    2022-08-08
  • SpringCloud Ribbon负载均衡实例解析

    SpringCloud Ribbon负载均衡实例解析

    这篇文章主要介绍了SpringCloud Ribbon负载均衡实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • Java中跳出多重循环嵌套的三种方法

    Java中跳出多重循环嵌套的三种方法

    这篇文章主要给大家介绍了关于Java中跳出多重循环嵌套的三种方法,很多复杂的运算以及逻辑可能用到嵌套循环,但是如何跳出当前的多重嵌套循环,很多同学特别是新手都操作的不是很清楚,需要的朋友可以参考下
    2023-07-07

最新评论