美文网首页
OOM问题原理解析(二):JVM内存回收机制与GC算法解析

OOM问题原理解析(二):JVM内存回收机制与GC算法解析

作者: bug音音 | 来源:发表于2021-01-20 17:32 被阅读0次

jvm想必大家听说过,毕竟在工作当中时不时的蹦出了什么OOM...这些东西,让很多的程序员都无从下手,甚至小的互联网公司都流行出了这样的一句话:“性能不够,机器来凑”!
那么在此,在工作之余就和大家一起探讨一下jvm调优的一些相关的实战操作,在分析jvm调优之前,你首先要明白java截止今天jdk的版本已经升级到了13的版本,当然我们要了解一下jvm底层的一些gc,也就是垃圾回收器的机制。

jvm内存结构

jvm的内存结构,相比jmm也就是jvm的内存模型来说容易理解了许多,毕竟可以通过图来在脑子中大概划分出轮廓。

img

jvm内存示意图&参数配置

安全点safePoint (安全区域)

谈到安全点,这一点也是十分的重要,这个是了解gc垃圾回收器的核心入口之一。那么安全点通常发生在什么时机呢?

安全点是什么?

安全点其实就是gc垃圾回收的入口点,也就是gc垃圾回收器是在什么时候进行垃圾回收的!在程序中,我们可以想到,无非就是一些:常见的异常(Exception)Object = null....等等一些操作的时候。比如一个用户线程进来之后,在jvm的堆内存空间中首先会分配内存,也就是在Edan区(下面会为大家介绍)内会为新生的对象开辟内存区域,此后用户要进行一些逻辑业务操作,但是当中有些操作的时候不小心发生了Exception的时候,jvm可以在此时的用户线程中标记一个安全点。当用户线程的在栈中最后的一个栈帧彻底执行完毕的时候,那么此时,我们就可以在这条用户线程的这个点标记一个安全点。那么这个安全点将会供gc的垃圾回收器使用,回收jvm的内存。

jvm中断操作

jvm的中断操作是基于上述介绍用户线程中的safePoint的也就是,jvm的gc在进行垃圾回收之前就是要根据safePoint进行的,在gc算法中可能就是标记,清除,整理等词类,大致分为抢先式中断和主动式中断。

img

抢先式中断&主动式中断(STW)

抢先式中断

在gc回收内存之前,抢先式中断就是此时jvm会把所有的用户线程统一停止,然后迭代用户线程中的safePoint去把对应的安全区域数据存入对应的OopMap中。如果发现安全点用户线程上没有,那么久恢复用户线程。

主动式中断

主动式中断的思想就是gc需要的时候,jvm会简单的针对线程设置一个标记,用户线程自行的轮询得到gc所需的数据。
图中的GC Roots其实就是我们常在CMS和G1垃圾回收器中的所见到的可达性分析。
在这两者中的中断的意思就是我们常常听说的STW操作,也就是STOP THE WORD(静止世界)意思就是在gc回收器回收内存的时候,所有的用户线程都必须sleep活着wait起来。初学者可以以把这两种中断理解为一个同步一个异步,这样好理解一些!
有了上述的一点jvm垃圾回收概念之后,我们来聊一下jvm的垃圾回收器!

jvm垃圾回收器&算法

Serial垃圾回收器&算法
img

Serial垃圾回收器.png

Serial垃圾回收器主要采用的是gc算法中的标记复制算法以及标记整理算法。新生代中是标记复制算法,老年代中是标记整理算法。
所谓的gc垃圾回收算法,在这里也简单的为大家复现一下!

标记累加算法(jdk刚出的时候的垃圾回收算法)

标记累加算法主要的核心算法原则就是针对用户对对象的使用,有一个类似程序计数器的东西,当程序计数器到达那个值的时候将新生代中对象capy到老年代,当程序计数器为多少时(你可以理解为-负数)时将会被gc回收掉该内存。但是这个算法有很大的致命性的缺陷,那就是总会发生对象不能及时的回收或者回收出现问题等,这样就会造成jvm的内存片段,久而久之也就发生了OOM内存溢出了!

标记清楚算法

标记清楚算法就是在年轻代中对不用的对象进行标记,标记完成之后就会进行gc的清除操作,但是大家都知道内存都是连续的,我假设有这样几个对象分别在内存中连续起来是a b c d 但是经过标记清楚算法之后,标记c为回收对象,那么结果就是a b d这样的话。c的内存位置将会空缺出来,如果刚好有和c差不多大小的对象,这样内存还能刚好合理的使用掉,如果来个对象比c大或者小的话,那么这段内存区域就不是完整的,同样会制造出内存泄漏,也会引发OOM。

标记复制算法

标记复制算法就要对新生代和年轻代的Edan和s0,s1有了解了。意思就是年轻代中只有一半的内存是可用的,当新生的内存从Edan到s0中的时候,假如gc进行垃圾回收,那么jvm会把需要回收的对象capy到s1中,然后彻底的清空s0区,再一次gc回收的话就反过来,就这样陆续操作,进行对象内存的回收!(此算法不适用于老年代,因此一般Old的垃圾回收器都不会采用标记复制算法)

标记整理算法

标记整理算法其实就是,假如年轻代不分区,就一个swever区,当gc进行垃圾回收的时候,将需要回收的对象直接进行清除,然后整理一次内存区域,比如a b c d四个对象连续排列在内存中,此时c要被回收,按平常的应该是a b [] d这样的,但是回收之后进行了一次内存整理之后变成了a b d 这样的内存区域,这样的话就不会发生内存片段的问题,也就不会制造出内存泄漏等一系列的问题。
gc的算法大概也就这么几种,由于时间的原因,这里就是介绍到这里,后续为大家更新出jvm中的几种gc会收器的特点以及所适应的环境!
有疑惑和不同见解的欢迎在下方留言,谢谢大家!

相关文章

  • OOM问题原理解析(二):JVM内存回收机制与GC算法解析

    jvm想必大家听说过,毕竟在工作当中时不时的蹦出了什么OOM...这些东西,让很多的程序员都无从下手,甚至小的互联...

  • JVM探秘之旅(壹)

    本文准备从以下几个方面去讲解JVM:1)JVM内存结构解析2)JVM的类加载机制剖析3)GC垃圾回收机制 JVM内...

  • Java基础 (14) 垃圾回收

    1)GC算法(各种算法的优缺点以及应用场景)2)内存对象的循环引用及避免3)内存回收机制、GC回收策略、GC原理时...

  • java(内存和gc)

    JVM内存和gc机制JVM内存 Java垃圾回收概况 Java GC(Garbage Collection,垃圾收...

  • 四级考试(1)

    1.简要阐述JVM的CMS GC算法和JVM的G1 GC算法的基本原理。 gc就是java的垃圾回收机制(gaba...

  • JVM问题及解答

    常见JVM问题 JVM内存模型,GC机制和原理。注意JVM内存模型与Java内存模型(JMM)不是同一个东西。JV...

  • jvm知识点总览

    jvm 总体梳理 jvm体系总体分四大块: 类的加载机制jvm内存结构GC算法 垃圾回收GC分析 命令调优 当然这...

  • java核心知识点,pdf文档,让你彻底告别重复的CRUD

    JVM 线程 JVM内存区域 JVM运行时内存 垃圾回收与算法 Java四种引用类型 GC 分代收集算法 VS 分...

  • JVM 内存结构 和内存回收算法

    一、JVM 内存模型、GC 1.1GC是啥? GC是垃圾回收机制,java中将内存管理交给垃圾回收机制,这是因为在...

  • 直击面试,聊聊 GC 机制

    GC 中文直译垃圾回收,是一种回收内存空间避免内存泄漏的机制。当 JVM 内存紧张,通过执行 GC 有效回收内存,...

网友评论

      本文标题:OOM问题原理解析(二):JVM内存回收机制与GC算法解析

      本文链接:https://www.haomeiwen.com/subject/nbsdzktx.html