返回顶部
首页 > 资讯 > 后端开发 > Python >JVM的垃圾回收机制真是通俗易懂
  • 396
分享到

JVM的垃圾回收机制真是通俗易懂

2024-04-02 19:04:59 396人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录堆内存的划分划分区域的目的一、新生区的垃圾回收机制二、什么时候进入老年区呢?1经历15次GC后进入老年区2动态对象年龄判断3大对象直接进入老年代4MinorGC后存活的对象太多无

堆内存的划分

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

  • 新生区、新生代、年轻代
  • 养老区、老年区、老年代
  • 永久区、永久代

在这里插入图片描述

划分区域的目的

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

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

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

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

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

在这里插入图片描述

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

在这里插入图片描述

3.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岁的对象就都要被全部转移到老年区。

在这里插入图片描述

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,相当于对新生区、老年区统一做了一次清理。

三种情况递进理解:

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

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

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

四、老年区垃圾回收算法

标记整理算法

【原理】

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

在这里插入图片描述

【缺点】

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

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

五、垃圾回收器

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

Seral 和 Seral Old垃圾回收器

  • 分别用于回收新生区和老年区。
  • 线程运行,垃圾回收时会停止我们系统的其他线程,再执行垃圾回收(不再使用);

ParNew和CMS垃圾回收器

  • 分别用于新生区和老年区;
  • 多线程并发,性能更好,现在一般是线上生产系统的标配。

G1垃圾回收器

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

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!    

--结束END--

本文标题: JVM的垃圾回收机制真是通俗易懂

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

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

猜你喜欢
  • JVM的垃圾回收机制真是通俗易懂
    目录堆内存的划分划分区域的目的一、新生区的垃圾回收机制二、什么时候进入老年区呢?1经历15次GC后进入老年区2动态对象年龄判断3大对象直接进入老年代4MinorGC后存活的对象太多无...
    99+
    2024-04-02
  • jvm回收垃圾的机制是什么
    JVM(Java虚拟机)使用自动垃圾回收(Garbage Collection)机制来管理和回收不再使用的对象的内存。以下是JVM垃...
    99+
    2023-08-30
    jvm
  • jvm垃圾回收机制指的是什么
    这篇文章主要介绍“jvm垃圾回收机制指的是什么”,在日常操作中,相信很多人在jvm垃圾回收机制指的是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”jvm垃圾回收机制指的是什么”的疑惑有所帮助!接下来,请跟...
    99+
    2023-07-05
  • jvm垃圾回收机制的原理是什么
    JVM(Java虚拟机)的垃圾回收机制是自动管理内存的一种机制,它通过识别和释放不再被程序使用的对象,以防止内存泄漏和内存溢出等问题...
    99+
    2023-09-25
    jvm
  • JVM垃圾回收机制有什么用
    这篇文章主要介绍JVM垃圾回收机制有什么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1.JVM的gc概述gc即垃圾收集机制是指jvm用于释放那些不再使用的对象所占用的内存。java语言并不要求jvm有gc,也没有...
    99+
    2023-06-17
  • JVM的垃圾回收机制你了解吗
    目录一:回收堆内存1.如何判定对象已死(可达性分析算法)2.对象的引用级别 3.对象的死亡过程二:垃圾回收算法1.标记清除算法2.标记复制算法3.标记整理算法三:垃圾收集器...
    99+
    2024-04-02
  • JVM【类加载与GC垃圾回收机制】
    JVM【类加载与GC垃圾回收机制】 🍎一.JVM🍒1.1JVM简介🍒1.2JVM执行流程 🍎二.JVM运行时数据区...
    99+
    2023-09-06
    jvm java 开发语言
  • JVM中垃圾回收机制的示例分析
    这篇文章主要介绍了JVM中垃圾回收机制的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。堆内存的划分分为三个部分(以下名词表示同一个区):新生区、新生代、年轻代养老区、...
    99+
    2023-06-29
  • JVM的垃圾回收机制详解与调优
    这篇文章主要讲解了“JVM的垃圾回收机制详解与调优”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JVM的垃圾回收机制详解与调优”吧!JVM的gc概述gc即垃圾收集机制是指jvm用于释放那些不...
    99+
    2023-06-03
  • PHP的垃圾回收机制
      一、原理 php5和php7的垃圾回收机制都是利用引用计数。 二、php5和php7不同点 1、PHP5标量数据类型会计数,PHP7标量数据类型不再计数,不需要单独分配内存。 2、PHP7的zval 需要的内存不再是单...
    99+
    2016-04-04
    PHP的垃圾回收机制
  • 带你一文读懂Python垃圾回收机制
    目录1 引用计数1.1 引用计数算法原理1.2 计数器增减条件1.2.1 引用计数+1的条件1.2.2 引用计数-1的条件1.2.3 代码实战1.3 引用计数的优点与缺点1.3.1 ...
    99+
    2023-05-15
    Python垃圾 Python垃圾回收 垃圾回收机制
  • Java垃圾回收机制是什么
    这篇文章主要介绍“Java垃圾回收机制是什么”,在日常操作中,相信很多人在Java垃圾回收机制是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java垃圾回收机制是什么”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-17
  • PHP垃圾回收机制是什么
    本篇内容主要讲解“PHP垃圾回收机制是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PHP垃圾回收机制是什么”吧!PHP的垃圾回收机制垃圾回收机制是一种动态存储分配的方案。它会自动释放程序不...
    99+
    2023-06-20
  • go垃圾回收机制是什么
    go语言中的垃圾回收机制是指自动管理内存分配和释放的机制。在Go语言中,开发者不需要手动去分配和释放内存,而是由垃圾回收机制自动进行...
    99+
    2023-10-25
    go
  • python垃圾回收机制是什么
    Python的垃圾回收机制是自动化的,它使用了引用计数和循环垃圾收集两种方法。1. 引用计数:Python中的每个对象都有一个引用计...
    99+
    2023-08-14
    python
  • JavaScript中的垃圾回收机制
    聚沙成塔·每天进步一点点 ⭐ 专栏简介⭐ JavaScript的垃圾回收机制⭐ 内存管理⭐ 引用计数⭐ 标记-清除算法⭐ 内存泄漏⭐ 性能优化⭐ 使用`delete`操作符⭐ 注意循环中的变量...
    99+
    2023-10-05
    javascript 开发语言 ecmascript
  • php的垃圾回收机制是怎样的
    php的垃圾回收机制:在php中,如果没有任何变量指向一个对象时,那么这个对象就将成为垃圾。php就会将它在内存中销毁,这就是php垃圾回收机制,目的是为了防止内存溢出。PHP 垃圾回收机制(Garbage Collector),简称GC。...
    99+
    2024-04-02
  • php7中垃圾回收机制是什么
    小编给大家分享一下php7中垃圾回收机制是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!php有什么用php是一个嵌套的缩写名称,是英文超级文本预处理语言,它...
    99+
    2023-06-08
  • PHP中的垃圾回收机制是什么
    这篇文章主要讲解了“PHP中的垃圾回收机制是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PHP中的垃圾回收机制是什么”吧!相信只要入门学习过一点开发的同学都知道,不管任何编程语言,一个...
    99+
    2023-06-20
  • Python中的垃圾回收机制是什么
    本篇文章给大家分享的是有关Python中的垃圾回收机制是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。GC作为现代编程语言的自动内存管理机制,专注于两件事:1. 找到内存中...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作