浅析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中使用注解获取和改变Bean的指定变量值

    Java中使用注解获取和改变Bean的指定变量值

    Java有时需要通过自定义注解,获取某Bean的某变量的值,根据业务要求处理数据,然后再把新值设置回Bean的同一变量中,这篇文章介绍了使用注解获取和改变Bean变量值的过程,感兴趣想要详细了解可以参考下文
    2023-05-05
  • JS+Struts2多文件上传实例详解

    JS+Struts2多文件上传实例详解

    这篇文章主要为大家详细介绍了JS+Struts2多文件上传实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • Java中如何获取mysql连接的3种方法总结

    Java中如何获取mysql连接的3种方法总结

    最近工作中需要用到mysql连接,发现实现的方法不止一个,所以就来总结下,下面这篇文章主要给大家介绍了关于Java中如何获取mysql连接的3种方法,需要的朋友可以参考借鉴,感兴趣的朋友们下面随着小编来一起学习学习吧。
    2017-08-08
  • SpringBoot去除内嵌tomcat的实现

    SpringBoot去除内嵌tomcat的实现

    这篇文章主要介绍了SpringBoot去除内嵌tomcat的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • JAVA学习笔记:注释、变量的声明和定义操作实例分析

    JAVA学习笔记:注释、变量的声明和定义操作实例分析

    这篇文章主要介绍了JAVA学习笔记:注释、变量的声明和定义操作,结合实例形式分析了Java注释、变量的声明和定义相关原理、实现方法及操作注意事项,需要的朋友可以参考下
    2020-04-04
  • shiro 与 SpringMVC的整合完美示例

    shiro 与 SpringMVC的整合完美示例

    shiro可以直接和spring整合,但是这样需要单独配置spring用于整合shiro,在配置springmvc,接下来通过实例代码给大家介绍shiro 整合 SpringMVC 的方法,感兴趣的朋友一起看看吧
    2021-08-08
  • SpringBoot深入刨析数据层技术

    SpringBoot深入刨析数据层技术

    这篇文章主要介绍了SpringBoot数据层技术的解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • Spring加载属性文件方式(自动加载优先级问题)

    Spring加载属性文件方式(自动加载优先级问题)

    这篇文章主要介绍了Spring加载属性文件方式(自动加载优先级问题),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • 深入剖析Java工厂模式让你的代码更灵活

    深入剖析Java工厂模式让你的代码更灵活

    Java工厂模式是一种创建对象的设计模式,它可以在不暴露对象创建逻辑的情况下,将对象的创建委托给子类或者其他对象。本文就来深入剖析一下Java工厂模式是如何让你的代码更灵活、可扩展、易维护的
    2023-05-05
  • Java读写.properties文件解决中文乱码问题

    Java读写.properties文件解决中文乱码问题

    这篇文章主要介绍了Java读写.properties文件解决中文乱码问题,非常具有实用价值,需要的朋友可以参考下
    2017-11-11

最新评论