返回顶部
首页 > 资讯 > 后端开发 > Python >JVMGC垃圾收集梳理总结
  • 253
分享到

JVMGC垃圾收集梳理总结

2024-04-02 19:04:59 253人浏览 独家记忆

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

摘要

目录什么是垃圾?什么是GC?如何发现垃圾?垃圾如何处理?常见的垃圾收集算法标记清除(mark sweep)拷贝算法 (copying)标记压缩/标记整理(mark compact)J

什么是垃圾?

对于程序汇总分配的内存,当使用完成后,这部分内存就会成为垃圾,需要对其进行释放,否则,这部分内存将无法被重复利用,最终造成内存泄漏。

什么是GC?

GC是一种自动的存储管理机制。当一些被占用的内存不再需要时,就应该予以释放。这种存储资源管理,称为垃圾回收。

对于java而言,是自动进行垃圾回收的。

如何发现垃圾?

既然要实现垃圾的自动回收,那么第一件事就是找到垃圾,那么如何发现垃圾呢?其实就是判断这个对象是否存活。

常见的两种方式判断

  • 1)引用计数法(reference count)
  • 2)根可达性算法(root searching)
名称实现思想优点缺点
引用计数法给每个对象添加一个引用计数器,当存在一个引用时,就加1,当一个引用失效时,就减1。判定效率高1、无法解决相互引用、循环引用的问题。 2、存储空间开销:需要空间存储计数器。 3、时间开销:需要处理计数器的增加和减少。
根可达性算法通过一系列名为”GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。解决了循环引用的问题实现较复杂,增加了计算成本。

引用计数法(reference count)的循环引用、相互引用: 没有外部引用,但是本身的计数器又不为0。

根可达性算法 由于引用计数法存在的问题,所有主流的jvm都不使用引用计数法,而是采用根可达性算法

如上图,带有GCRoots的对象表示正在被引用,而其他的对象虽然相互间有引用,但是没有根节点,仍然会被删除。

GCRoots对象: 哪些对象可以成为GCRoots呢?jvm中主要针对堆内的内存进行垃圾回收,而在虚拟机栈、本地方法栈和方法区内的对象则不会被回收,通常选择这三个区域的对象作为GCRoots。

在jvm中主要有以下四种,在方法区存在两种:

  • 1)虚拟机栈中引用的对象:虚拟机栈帧中的局部变量表所引用的对象
  • 2)本地方法栈中引用的对象:JNI (Native方法)引用的对象
  • 3)方法区中类静态和常量对象:静态变量常量引用的对象

以下图来展示在JVM内存模型(JMM)的GCRoots:

 在根可达性算法中,所有的引用都是强引用,下面具体分析下jvm中的四种引用。

四种引用: 参考:分享JVM 的四种引用方式

名称定义特点回收
强引用强引用就是引用了通过new 的方式创建的对象。是指创建一个对象并把这个对象赋给一个引用变量;在root搜索算法的里面,说的引用都指的是强引用关系。GC时,永远不会被回收,导致OOM的主要原因1、引用消失(比如方法执行完) 2、将引用变量设置为null
软引用如果一个对象具有软引用,内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存,比如网页缓存、图片缓存等。使用软引用能防止内存泄露,增强程序的健壮性。Java中,用SoftRefrence表示弱引用。内存不足时(自动触发GC),会被回收内存不足时,触发自动回收
弱引用引用也是用来描述非必需对象的,当JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。在java中,用java.lang.ref.WeakReference类来表示无论内存是否充足,只要进行GC,都会被回收只要进行GC,都会被回收
虚引用虚引用和前面的软引用、弱引用不同,它并不影响对象的生命周期。在java中用java.lang.ref.PhantomReference类表示。如果一个对象与虚引用关联,则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收。 要注意的是,虚引用必须和引用队列关联使用,设置虚引用关联的唯一目的,就是在这个对象被收集器回收的时候收到一个系统通知或者后续添加进一步的处理。Java技术允许使用finalize()方法在垃圾收集器将对象从内存中清除之前做必要的清理工作。如同虚设,和没有引用没什么区别任何时候都可能被回收

垃圾如何处理?

我们通过上面学到的根可达性算法可以发现垃圾的所在,那么jvm是如何进行垃圾回收的呢?通过jvm提供的垃圾收集器(GC) 。

目前有以下种类的垃圾收集器,其中虚线表示垃圾收集器可以进行组合使用:

常见的垃圾收集算法

标记清除(mark sweep) :位置不连续 产生碎片 效率偏低(两遍扫描) 拷贝算法 (copying) :没有碎片,浪费空间 标记压缩(mark compact) :没有碎片,效率偏低(两遍扫描,指针需要调整)

标记清除(mark sweep)

顾名思义,标记清除算法分为两个阶段标记(mark) 和清除(sweep) 。

标记: Collector从引用根结点开始遍历,标记所有被引用的对象。一般是在对象的Header中记录为可达对象。

清除: Collector对堆内存从头到尾进行线性的遍历,如果发现某个对象在其Header中没有标记为可达对象,则将其回收。

对所有能找到根节点引用的内存空间进行标记,清除没有找到根节点的内存空间,其大概实现过程如下:

缺点 :

  • 1)STW(stop the Word),回收时,应用挂起。
  • 2)内存越大,效率越多,需要扫描的时间越长。
  • 3)内存碎片化,会导致无法装下新申请的对象,整体内存是足够的,但并非连续的。

拷贝算法 (copying)

拷贝算法将内存空间划分为两个区间,在任意时间点,所有动态分配的对象都只能分配在其中一个区间(称为活动区间),而另外一个区间(称为空闲区间)则是空闲的。

当活动区间的内存占满时,接下来GC线程会将活动区间内的存活对象,全部复制到空闲区间,且严格按照内存地址依次排列,与此同时,GC线程将更新存活对象的内存引用地址指向新的内存地址。

其大概过程如下图所示:

缺点 浪费内存,并且存活对象越多的情况下,效率越低。

标记压缩/标记整理(mark compact)

标记过程仍然和标记-清除一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理端边界以外的内存。

实现过程大概如下:

缺点 效率不高,除了要标记存活对象,还要整理存活对象的引用地址,效率低于复制算法。

总结 以上三种算法都是根据根可达性算法实现的。当开始GC时,三种算法都会造成STW(stop the world)。

JVM的内存模型如何实现垃圾回收?分代模型

文章前面介绍了简单很多种垃圾收集器,不同的垃圾收集器有不同的分代模型:

  • 1)除Epsilon、ZGC、Shenandoah之外的GC都是使用逻辑分代模型
  • 2)G1是逻辑分代,物理不分代
  • 3)除1)2)之外不仅逻辑分代,而且物理分代

分代模型:

上图中的分代模型有些需要特别关注的点:

  • 1)整个分代模型的组成:新生代 + 老年代 + 永久代(jdk1.7)/元空间(jdk1.8) 永久代、元空间:Class 永久代:必须指定大小限制 元空间:可以设置大小,也可以不设置,无上限(受限于物理内存) 字符串常量池: jdk1.7 - 永久代,jdk1.8 - 堆 MethodArea(方法区)逻辑概念:永久代、元数据
  • 2)新生代: Eden + 2个suvivor区 YGC回收之后,大多数的对象会被回收,活着的进入s0 再次YGC,活着的对象eden + s0 -> s1 再次YGC,活着的对象eden + s1 -> s0 年龄足够 -> 老年代 (通常15,对象头Mark Word 的age只有4bit,最大是15 、CMS 6) suvivor区装不下 -> 老年代
  • 3)老年代 老年代满了FGC Full GC(STW)

GC Tuning 尽量减少FGC MinorGC = YGC MajorGC = FGC

到此这篇关于JVM GC 垃圾收集梳理总结的文章就介绍到这了,更多相关JVM GC 垃圾收集 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: JVMGC垃圾收集梳理总结

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

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

猜你喜欢
  • JVMGC垃圾收集梳理总结
    目录什么是垃圾?什么是GC?如何发现垃圾?垃圾如何处理?常见的垃圾收集算法标记清除(mark sweep)拷贝算法 (copying)标记压缩/标记整理(mark compact)J...
    99+
    2024-04-02
  • JVM知识总结之垃圾收集算法
    目录一、什么是垃圾1.1 引用计数算法1.1.1 优点1.1.2 缺点1.2 可达性分析算法1.2.1 优点 二、什么是引用2.1 JDK1.2以前2.2 JDK1.2之后...
    99+
    2024-04-02
  • JVM垃圾回收——G1垃圾收集器
    目录 一、什么是G1垃圾收集器 二、G1垃圾收集器的内存划分 三、G1垃圾收集器的收集过程  四、G1收集器的优缺点 五、G1收集器的JVM参数配置 一、什么是G1垃圾收集器         Garbage First(简称G1)收集...
    99+
    2023-10-25
    jvm java G1
  • 垃圾收集趣史-Java垃圾收集算法 --- 王咏刚
    在了解垃圾收集算法的起源之前,有必要先回顾一下内存分配的主要方式。我们知道,大多数主流的语言或运行环境都支持三种最基本的内存分配方式,它们分别是: ...
    99+
    2023-06-03
  • Java详细分析梳理垃圾回收机制
    目录Java语言的垃圾回收1.垃圾回收机制的基本概念2.Java垃圾回收机制的好处3.Java垃圾回收机制的特点总结Java语言的垃圾回收 1.垃圾回收机制的基本概念 问:1.什么是...
    99+
    2024-04-02
  • .NET垃圾回收机制知识点总结
    这篇文章主要讲解了“.NET垃圾回收机制知识点总结”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“.NET垃圾回收机制知识点总结”吧! .NET资源分托管资源和非托管资源,对于托管资源,.NE...
    99+
    2023-06-17
  • JavaScript垃圾回收机制原理总结深入探究
    目录1. 垃圾为何要产生并回收2. 垃圾回收机制2.1 标记清除法2.2 引用计数法3. V8对垃圾回收机制的优化——分代式垃圾回收机制3.1 新生代与老生代...
    99+
    2022-11-13
    JavaScript垃圾回收 JS垃圾回收机制
  • 怎么理解java的垃圾收集器
    本篇内容主要讲解“怎么理解java的垃圾收集器”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么理解java的垃圾收集器”吧!初识引用对于刚接触 Java 的 C++ 程序员而言,理解栈和堆的关...
    99+
    2023-06-16
  • JVM执行引擎和垃圾回收要点总结
    目录一、执行引擎二、垃圾对象标记1、引用计数法2、可达性分析算法三、垃圾回收机制1、标记清除算法2、标记整理算法3、复制算法4、分代收集算法四、源代码地址一、执行引擎 应用程序经过...
    99+
    2024-04-02
  • JavaScript垃圾回收器的相关知识点总结
    本篇内容介绍了“JavaScript垃圾回收器的相关知识点总结”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成...
    99+
    2024-04-02
  • java性能优化四种常见垃圾收集器汇总
    目录前言常见的垃圾回收器和算法serial 串行垃圾收集器Parallel 多线程垃圾收集器CMS 收集器G1 收集器显式垃圾收集前言 本篇文章我们来具体看看如何选择合适的垃圾收集器...
    99+
    2024-04-02
  • Java中如何使用垃圾收集器
    Java中如何使用垃圾收集器,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Java垃圾收集器使用小诀窍,垃圾收集器(Garbage Collector,GC)是现代软件虚拟机技...
    99+
    2023-06-17
  • jvm默认垃圾收集器是什么
    JVM(Java虚拟机)的默认垃圾收集器取决于所使用的Java版本和操作系统。在JDK 8及之前的版本中,默认的垃圾收集器是Para...
    99+
    2023-09-26
    jvm
  • JVM常见垃圾收集器有哪些
    这篇文章主要介绍了JVM常见垃圾收集器有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇JVM常见垃圾收集器有哪些文章都会有所收获,下面我们一起来看看吧。垃圾收集器类型垃圾收集器 是 垃圾收集算法 的具体实现...
    99+
    2023-07-02
  • 理解Python垃圾回收机制
    一.垃圾回收机制 Python中的垃圾回收是以引用计数为主,分代收集为辅。引用计数的缺陷是循环引用的问题。 在Python中,如果一个对象的引用数为0,Python虚拟机就会回收这个对象的内存。 #en...
    99+
    2022-06-04
    机制 垃圾 Python
  • 如何理解Java垃圾回收
    这篇文章主要介绍“如何理解Java垃圾回收”,在日常操作中,相信很多人在如何理解Java垃圾回收问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何理解Java垃圾回收”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-15
  • JVM常见垃圾收集器学习指南
    目录前言垃圾收集器类型1. Serial收集器1.1 定义1.2 优点1.3 使用的垃圾收集算法1.4 应用场景1.5 工作流程2. Serial Old收集器2.1 定义2.2 优...
    99+
    2024-04-02
  • JVM常用垃圾收集器详细解说
    目录前言新生代垃圾收集器老年代垃圾收集器不分代垃圾收集器前言 在上一篇,我们谈到了jvm垃圾回收算法详细解析,并了解了JVM中针对堆区中不同的分代采用不同的垃圾回收算法 在了解了垃圾...
    99+
    2024-04-02
  • JDK5.0垃圾收集优化之--Don't Pause
    原本想把题目更简单的定为--《不要停》的,但还是自己YY一下就算了。 Java开发Server最大的障碍,就是JDK1.4版之前的的串行垃圾收集机制会引起长时间的服务暂停,明白原理后,想想那些用JDK1.3写Server的先辈,不...
    99+
    2023-06-03
  • 详解Java 虚拟机(第⑤篇)——垃圾收集
    垃圾收集主要是针对堆和方法区进行。程序计数器、虚拟机栈和本地方法栈这三个区域属于线程私有的,只存在于线程的生命周期内,线程结束之后就会消失,因此不需要对这三个区域进行垃圾回收。一、判断一个对象是否可被回收1. 引用计数算法为对象添加一个引用...
    99+
    2023-06-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作