返回顶部
首页 > 资讯 > 精选 >JVM中垃圾回收机制的示例分析
  • 603
分享到

JVM中垃圾回收机制的示例分析

2023-06-29 07:06:08 603人浏览 薄情痞子
摘要

这篇文章主要介绍了JVM中垃圾回收机制的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。堆内存的划分分为三个部分(以下名词表示同一个区):新生区、新生代、年轻代养老区、

这篇文章主要介绍了JVM中垃圾回收机制的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

    堆内存的划分

    分为三个部分(以下名词表示同一个区):

    • 新生区、新生代、年轻代

    • 养老区、老年区、老年代

    • 永久区、永久代

    JVM中垃圾回收机制的示例分析

    划分区域的目的

    唯一目的就是优化GC性能。

    如果没有分代,我们所有的对象都放在一块,GC的时候我们需要对堆的所有区域进行扫描。而很多的对象都是“朝生夕死”的,如果把创建的新的对象都放在某一地方,当GC的时候就先把“朝生夕死”对象的区域进行回收,这样就会腾出很多大的空间来。

    一、新生区的垃圾回收机制

    新生区分为:Eden区、Survivor0区、Survivor1区(也称为from区和to区)
    其中Eden区占80%的内存空间,每块Survivor各占用10%的内存空间(如:Eden占800M,每个Survivor占100M)

    开始时创建的对象都是分配在Eden区域中,当Eden区快满了,就会触发垃圾回收Minor GC(使用复制算法进行垃圾回收)

    JVM中垃圾回收机制的示例分析

    Minor GC处理后,首先会把Eden区中还存活着的对象一次性转入其中一块空闲着的Survivor区。然后清空Eden区,之后创建的对象就继续放入Eden区中了,直至下次Eden又被填满。

    JVM中垃圾回收机制的示例分析

    Eden再次被填满时,就会再次出发Minor GC,清理后(Minor会清理Eden区和Survivor区的内存),Eden区和存在对象的Survivor区(此时的from区)中存活的对象转移到另一块空着的Survivor区中(此时的to区),并清空Eden区和之前存在对象的Survivor区(此时变为to区了,“From”和“To”会交换他们的角色,也就是新的“To”就是上次GC前的“From”,新的“From”就是上次GC前的“To”。)

    这就是复制算法的流程。
    一直要保持一个Survivor区是空的以提供复制算法垃圾回收,而这块区域的内存只占整块的10%,其他90%内存都可以被使用,课件内存利用率还是相当高的。

    二、什么时候进入老年区呢?

    1 经历15次GC后进入老年区

    默认情况下,如果新生区中的某个对象经历了15次GC后,还是没有被回收掉,那么它就会被转入老年区。
    可通过JVM参数“-XX:MaxTenuringThreshold”来设置,默认是15。

    2 动态对象年龄判断

    这种方法不用等到经历GC15次。
    假如一批对象总大小大于当前Survivor区内存的50%,那么大于等于这批对象年龄的对象就会被转移到老年区。

    例:假设Survivor0区中的两个对象都经历的3次GC(年龄3),而且这两个对象总大小50M,超过了Survivor0区内存大小的一半。那么此时Survivor0区中年龄大于等于3岁的对象就都要被全部转移到老年区。

    JVM中垃圾回收机制的示例分析

    3 大对象直接进入老年代

    有一个JVM参数"-XX:PretenureSizeThreshold",默认值是0,表示任何情况都先把对象分配给Eden区。
    若设置为1048576字节,也就是1M。则表示当创建的对象大于1M时,就会直接把这个对象放入到老年区,就根本不会经过新生区了。
    这么做的原因:大对象在经历复制算法进行GC的时候会降低性能。

    4 Minor GC后存活的对象太多无法放入Survivor区了

    Minor GC后存活的对象太多,导致Survivor区放不下了,此时就会将所有的对象直接转移到老年区中。

    三、老年区空间分配担保原则

    执行每一次Minor GC前,JVM都先检查一下老年区可用的内存空间是否大于新生区所有对象的总大小。

    原因:极端情况下,Minor GC后,新生代中所有的对象都活了下来,那就会把所有新生代中的对象放入老年区中。

    • 如果说老年区可用内存大于新生代对象总大小,那么就可以放心的执行Minor GC。

    • 但如果老年区内存小于新生区对象的总大小,这时候就会看一个参数:“-XX:HandlePromotionFailure”是否设置为true了。如果为true,就进入下一次判断,看老年区可用内存是否大于之前每次Minor GC后进入老年区对象的平均大小。如果老年代可用内存小于平均大小或是参数没有设置成true,那就会直接触发“Full GC”,就是对老年代进行垃圾回收,腾出空间后,再进行Minor GC,相当于对新生区、老年区统一做了一次清理。

    三种情况递进理解:

    如果Minor GC后,存活的对象<Survivor区大小,直接进入Survivor区即可;

    如果Minor GC后,存活的对象>Survivor区大小,但<老年区可用内存,直接进入老年区;

    若Minor GC后,此时老年区都放不下这些存活的对象了,就会触发Full GC;
    如果Full GC后老年区内存还是不够用,就会导致OOM内存溢出。

    四、老年区垃圾回收算法

    标记整理算法

    【原理】

    一开始对象都是任意分布的,在经历完垃圾回收之后,就会标记出哪些是存活对象,哪些是垃圾对象,然后就会把这些存活的对象在内存中进行整理移动,尽量都挪到一边去靠在一起,然后再把垃圾对象进行清除,这样做的好处就是避免了垃圾回收后产生的大片内存碎片。

    JVM中垃圾回收机制的示例分析

    【缺点】

    较为耗时,比复制算法慢10倍;

    所以如果系统频繁出现Full GC,会严重影响系统性能,出现卡顿。所以JVM优化的一大问题就是减少Full GC频率。

    五、垃圾回收器

    新生区和老年区进行垃圾回收时是通过不同的垃圾回收器进行回收的

    Seral 和 Seral Old垃圾回收器

    • 分别用于回收新生区和老年区。

    • 线程运行,垃圾回收时会停止我们系统的其他线程,再执行垃圾回收(不再使用);

    ParNew和CMS垃圾回收器

    • 分别用于新生区和老年区;

    • 多线程并发,性能更好,现在一般是线上生产系统的标配。

    G1垃圾回收器

    统一收集新生区和老年区,采用更加优秀的算法机制。

    感谢你能够认真阅读完这篇文章,希望小编分享的“JVM中垃圾回收机制的示例分析”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网精选频道,更多相关知识等着你来学习!

    --结束END--

    本文标题: JVM中垃圾回收机制的示例分析

    本文链接: https://lsjlt.com/news/323593.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • JVM中垃圾回收机制的示例分析
      这篇文章主要介绍了JVM中垃圾回收机制的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。堆内存的划分分为三个部分(以下名词表示同一个区):新生区、新生代、年轻代养老区、...
      99+
      2023-06-29
    • js中垃圾回收机制的示例分析
      这篇文章主要介绍了js中垃圾回收机制的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。原理找到不再被使用的变量,然后释放其占用的内存,...
      99+
      2024-04-02
    • PHP中垃圾回收机制的示例分析
      小编给大家分享一下PHP中垃圾回收机制的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!如果用过C语言,那么申请内存的方式是malloc或者是calloc,...
      99+
      2023-06-15
    • kubernetes中垃圾回收机制的示例分析
      这篇文章主要介绍了kubernetes中垃圾回收机制的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一:前言Kubernetes系统在长时间运行后,Kubernete...
      99+
      2023-06-04
    • JVM垃圾回收算法的示例分析
      这篇文章主要介绍了JVM垃圾回收算法的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。新一代JVM垃圾回收算法JVM垃圾回收的瓶颈传统分代JVM垃圾回收方式,已经在一定...
      99+
      2023-06-17
    • 浏览器中垃圾回收机制的示例分析
      这篇文章将为大家详细讲解有关浏览器中垃圾回收机制的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。浏览器的垃圾回收机制垃圾回收是一种自动的内存管理机制。当计算机上的...
      99+
      2024-04-02
    • JVM中垃圾收集算法的示例分析
      这篇文章给大家分享的是有关JVM中垃圾收集算法的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、什么是垃圾本文要讲的是垃圾收集算法,那么首先要确定的问题就是什么是垃圾,也就是哪些对象是要被回收的,对此有...
      99+
      2023-06-15
    • PHP中垃圾收集机制的示例分析
      这篇文章主要为大家展示了“PHP中垃圾收集机制的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“PHP中垃圾收集机制的示例分析”这篇文章吧。PHP的垃圾收...
      99+
      2024-04-02
    • 分析PHP的垃圾回收机制
      如果用过C语言,那么申请内存的方式是malloc或者是calloc,然后你用完这个内存后,一定不要忘了用free函数去释放掉,这就是传说中手动垃圾回收,一般都是扫地神僧用这种方式。很...
      99+
      2024-04-02
    • Java垃圾回收的示例分析
      这篇文章将为大家详细讲解有关Java垃圾回收的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Java垃圾回收是一项自动化的过程,用来管理程序所使用的运行时内存。通过这一自动化过程,JVM解除了程序...
      99+
      2023-05-30
      java
    • jvm回收垃圾的机制是什么
      JVM(Java虚拟机)使用自动垃圾回收(Garbage Collection)机制来管理和回收不再使用的对象的内存。以下是JVM垃...
      99+
      2023-08-30
      jvm
    • php内存管理机制与垃圾回收机制的示例分析
      这篇文章给大家分享的是有关php内存管理机制与垃圾回收机制的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、内存管理机制先看一段代码:<php//内存管理机制var_dump(memory_get...
      99+
      2023-06-15
    • JVM垃圾回收机制有什么用
      这篇文章主要介绍JVM垃圾回收机制有什么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1.JVM的gc概述gc即垃圾收集机制是指jvm用于释放那些不再使用的对象所占用的内存。java语言并不要求jvm有gc,也没有...
      99+
      2023-06-17
    • jvm垃圾回收机制指的是什么
      这篇文章主要介绍“jvm垃圾回收机制指的是什么”,在日常操作中,相信很多人在jvm垃圾回收机制指的是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”jvm垃圾回收机制指的是什么”的疑惑有所帮助!接下来,请跟...
      99+
      2023-07-05
    • JVM的垃圾回收机制你了解吗
      目录一:回收堆内存1.如何判定对象已死(可达性分析算法)2.对象的引用级别 3.对象的死亡过程二:垃圾回收算法1.标记清除算法2.标记复制算法3.标记整理算法三:垃圾收集器...
      99+
      2024-04-02
    • Java垃圾回收机制的示例详解
      目录一、概述二、对象已死?1.引用计数算法2.可达性分析算法3.四种引用4.生存还是死亡?5.回收方法区三、垃圾收集算法1.分代收集理论2.名词解释3.标记-清除算法4.标记-复制算...
      99+
      2024-04-02
    • 分析python垃圾回收机制原理
      目录引用计数引用计数案例导致引用计数 +1 的情况导致引用计数-1 的情况循环引用导致内存泄露分代回收垃圾回收gc 模块常用函数:引用计数 Python 语言默认采用的垃圾...
      99+
      2024-04-02
    • PHP垃圾回收机制原理分析
      这篇文章主要介绍了PHP垃圾回收机制原理分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。PHP垃圾回收机制1、每一个变量定义时都保存在一个...
      99+
      2024-04-02
    • JVM中怎么解析JVM分代垃圾回收策略
      这篇文章将为大家详细讲解有关JVM中怎么解析JVM分代垃圾回收策略,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。由于不同对象的生命周期不一样,因此在JVM的垃圾回收策略中有分代这一策略。JV...
      99+
      2023-06-17
    • 垃圾回收机制
        我们定义变量会申请内存空间来存放变量的值,而内存的容量是有限的,当一个变量值没有用了(称为垃圾),就应该将其占用的内存给回收掉。变量名是访问到变量的唯一方式,所以当一个变量值没有任何关联的变量名时,我们就无法访问到该变量了,该变量就是...
      99+
      2023-01-30
      机制 垃圾
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作