广告
返回顶部
首页 > 资讯 > 后端开发 > Python >java 垃圾回收机制以及经典垃圾回收器详解
  • 417
分享到

java 垃圾回收机制以及经典垃圾回收器详解

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

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

摘要

判断对象存活方法 引用计数法:在对象中添加一个引用计数子,每当一个地方引用他时,计数器就加一,当引用失效时,计数器就减一。 会有对象循环引用问题: objA.instance =

判断对象存活方法

引用计数法:在对象中添加一个引用计数子,每当一个地方引用他时,计数器就加一,当引用失效时,计数器就减一。

会有对象循环引用问题:


objA.instance = objB
objB.instance = objA

objA 有objB 的引用 objB 有 objA 的引用,他们相互引用着对方。导致他们无法回收。

可达性分析:

GC Roots 根对象作为起点,根据引用关系向下搜索,如果对象可达,就说明对象存活,如果对象不可达,就说明对象可以被回收。

GC Roots的根对象为:

1)在虚拟机栈 栈帧中的 本地变量表 中引用的对象

2)方法区静态属性引用的对象

3)方法区常量引用 的对象,如字符串常量池中的引用

4)本地方法栈中JNI引用的对象

5)虚拟机内部引用的对象,如基本数据类型对应的Class对象,一些常驻的异常对象等,还有系统类加载器

6)被同步持有的对象

收集线程和用户线程在并发可达性分析

并发 的可达性分析,由于用户线程会即时修改对象的引用关系, 可能会造成两种异常:

1)原本消亡的对象错误标记为存活,这个可以接受,就造成浮动垃圾,下一次收集即可。

2)原本存活的对象 标记为 消失。

三色法分析图:

在这里插入图片描述

黑色:已经扫描过的对象

灰色:已经访问过,但还有一个引用没有被扫描

白色:为被访问过,若到最后还是白色,说明此对象是需要回收的。

黑色误标记为白色有两个条件

1)复制器插入一条或多条从黑色对象到白色对象的新引用

2)复制器删除了全部从灰色对象到该白色对象的直接或间接的引用

解决方法:

1)增量更新,破坏条件1,把黑色对象对白色对象的新增引用记录下来,等并发扫描结束后,再以这些对象出发重新扫描。

2)原始快照(SATB),破解条件2,当灰色对象要删除对白色对象的引用关系时,记录下来。并发结束后再以记录节点开始重新扫描。

分代收集

堆:

新生代(1/3) 老年代(2/3)

新生代 分为 Eden/From/To

新生代存放:比较小,时长比较小

老年代:比较大 存放时长比较大

轻GC

重GC(full GC) -> STW(停止事件),fallGc特别费资源

Eden -> from <-> To -> old

对象在from和to循环15(默认)次之后,会放到老年代

垃圾收集算法

标记-清除 算法:

算法分为标记 和 清除两个阶段,首先标记出所需要回收的对象,标记完成之后,统一回收所标记的对象。

优点:最基础的算法,实现简单

缺点:1)执行效率不稳定,对象越多,效率越低

2)内存碎片化,需要分配大对象时可能无足够连续的空间。

代表垃圾收集器:

标记复制算法(复制算法):

把内存分为大小相等的两块,每次只使用其中一款,当一块快用完时,它将存活的对象复制到另一块上。

优点:能产生连续的空间

缺点:耗内存,对象存活率较高时,效率会降低(不适合老年代)。

代表垃圾收集器: 很多新生代的回收,都用这种算法。

标记整理 算法

首先标记出所需要的对象,标记完成后,对存活对象移动到内存的一段,然后清除边界外的对象。

优点:有连续的内存空间;系统吞吐量(用户线程和收集器的效率总和)会提高。

缺点:整理内存耗时会比较大,会造成 “Stop The World”;

代表垃圾收集器:Parallel Scavenge收集器

CMS中主要用标记清除算法,但是当内存碎片化到影响对象分配时,就会使用一次标记整理算法 去整理内存碎片。

垃圾收集器

Serial收集器

最基础最悠久的垃圾收集器,叫做 串行收集器,它进行垃圾收集的时候,会停止用户线程(Stop the world)。

新生代垃圾收集器用 Serial,基于复制算法

老年代垃圾收集器用 Serial Old,基于标记整理算法。

在这里插入图片描述

优点:所有垃圾收集器中内存消耗最小的,对单核或单线程处理器来说,效率很高。运行在客户端

缺点:stop the world

ParNew收集器

​ ParNew收集器就是Serial收集器的多线程并行版,除了支持多线并行收集之外,没有太多创新之处。

在这里插入图片描述

CMS垃圾收集器作为老年代垃圾收集器,不能与Parallel Scavenge配合工作,只能选择 ParNew或者Serial收集器。

Parallel Scavenge收集器

新生代垃圾收集器,基于 标记复制算法,也是可以通过并行收集的多线程收集器。他关注 吞吐量(用户线程时间/总时间)。

在这里插入图片描述

CMS 垃圾收集器

CMS 收集器是一种以获取最短停顿时间作为目标的垃圾收集器。基于标记清除算法。

步骤:

初始标记->并发标记->重新标记->并发清除

在这里插入图片描述

1)初始标记:stop the world,标记GC ROOT 能直接关联的对象,速度很快

2)并发标记:从GC Root直接关联的对象开始遍历整个对象图,时间较长,但与用户线程并行

3)重新标记:stop the world,修正并发标记期间对象的状态的改变(增量更新算法,标记新的黑色指向白色的引用),时间也比较短。

4)并发清除:与用户线程同步。

优点:并发收集、低停顿。

缺点:

1)对处理器资源敏感,当处理器核心数量在四个以下时,CMS对用户程序影响很大。

2)有浮动垃圾,并发标记时会产生新的垃圾,但是CMS本次不会清理它,要等到下一次才会清理。从而可能造成内存不够而产生Stop the world 的Full GC

3)基于标记清除算法,会产生大量的空间碎片,而触发Full GC

G1垃圾收集器

关注吞吐量和延迟时间的最佳平衡。

从整体看,主要采用标记整理算法,从局部看,是标记-复制算法(两个Region 之间的复制)。

G1把 java对 划分为多个大小相等独立区域 Region,每一个Region 都可以根据需要,扮演 Eden空间、Survivor空间或者老年代空间。

G1对年代的划分存在概念上,它可以不是连续的区间。。

Region 还有一类特殊的HumonGous区域,专门存储大对象(1M-32M,可配),把超过Region大小的对象分配在连续的 Humongous Region之中。

每次收集时以Region作为最小单元,G1收集器去根据Region里面垃圾队的价值大小,在后台维护一个优先级列表,优先处理回收价值收益最大的那些Region(每次收集到的内存大小及回收时间的经验值)。

G1至少耗费打印java堆容量的10%到20%来维持收集工作。

TAMS指针:在并发过程中保存新建的对象。

STAB:灰色引用对白色引用的删除 记录下来。

G1的步骤:

1)初始标记:stop the world,仅仅标记GC ROOTs 能直接关联的对象,并且修改TAMS指针

2)并发标记:从GC ROOTS 直接关联的对象出发,扫描对象图(并还要处理SATB记录下并时有变动的对象),时间长,但是与用户线程并行,

3)最终标记:stop the world,短暂,处理遗留下来的少量SATB记录

4)帅选回收:stop the world,负责更新Region的统计数据,对Region的回收价值和成本进行排序。根据用户所期望的停顿时间(JVM参数可配)来制定回收计划。可以自由选择多个Region作为回收集,然后把存活的对象复制到空的Region中,然后清空回收集的Region。

除了并发标记外,其它都用停止用户线程,目标不是单纯的追求低延迟,而是延迟可控的情况下获取最大的吞吐量(用户线程时间/总时间,总时间为用户线程时间+垃圾收集时间)。

在这里插入图片描述

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: java 垃圾回收机制以及经典垃圾回收器详解

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • java 垃圾回收机制以及经典垃圾回收器详解
    判断对象存活方法 引用计数法:在对象中添加一个引用计数子,每当一个地方引用他时,计数器就加一,当引用失效时,计数器就减一。 会有对象循环引用问题: objA.instance =...
    99+
    2022-11-12
  • java中的垃圾回收机制以及经典垃圾回收器的详细介绍
    本篇内容介绍了“java中的垃圾回收机制以及经典垃圾回收器的详细介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!判断对象存活方法引用计数法...
    99+
    2023-06-20
  • Java的垃圾回收机制详解
    目录 1、C语言与Java语言垃圾回收区别 2、System.gc() 3、面试题引入Java垃圾回收 3.1 jvm怎么确定哪些对象应该进行回收 3.1.1 引用计数法 3.1.2 可达性分析算法  3.2 jvm会在什么时候进行垃圾回收...
    99+
    2023-09-13
    java jvm 开发语言
  • 垃圾回收机制
      我们定义变量会申请内存空间来存放变量的值,而内存的容量是有限的,当一个变量值没有用了(称为垃圾),就应该将其占用的内存给回收掉。变量名是访问到变量的唯一方式,所以当一个变量值没有任何关联的变量名时,我们就无法访问到该变量了,该变量就是...
    99+
    2023-01-30
    机制 垃圾
  • Python垃圾回收机制详解
    目录1. 引用计数2. 标记-清除3. 分代回收4. 其他4.1 JNI(Java Native Interface)总结 Python 的GC模块主要运用了引用计数来跟踪和回收垃圾...
    99+
    2022-11-12
  • Java 中的垃圾回收机制详解
    目录介绍重要条款:使对象符合 GC 条件的方法请求JVM运行垃圾收集器的方式定稿总结介绍 在 C/C++ 中,程序员负责对象的创建和销毁。通常程序员会忽略无用对象的销毁。由...
    99+
    2022-11-12
  • Java jvm垃圾回收详解
    目录常见面试题1.JVM内存回收和分配1.1主要的区域?gc测试1.2大对象进入老年代1.3长期存活的对象进入老年代1.4主要进行gc的区域gc的类型Young GcFull Gc1...
    99+
    2022-11-12
  • GC垃圾回收机制
    GC垃圾回收机制 一、 GC原理:1、为什么进行垃圾回收 二、JVM与回收算法:1、内存分配2、回收算法1、标记-清除(Mark-sweep)2、复制(Copying)3、标记-整理(Ma...
    99+
    2023-09-24
    jvm java 算法
  • day09(垃圾回收机制)
    1,复习 文件处理 1.操作文件的三步骤 -- 打开文件:硬盘的空间被操作系统持有 | 文件对象被应用程序持续 -- 操作文件:读写操作 -- 释放文件:释放操作系统对硬盘空间的持有 2.基础的读写 ...
    99+
    2023-01-31
    机制 垃圾
  • python垃圾回收机制!
    python的三种垃圾回收机制:1.python采用的是引用计数机制为主;2.标记-清除;为辅的策略3.分代收集(隔代回收、分代回收)为辅的策略 现在的高级语言如java,c#等,都采用了垃圾收集机制,而不再是c,c++里用户自己管理维护内...
    99+
    2023-01-31
    机制 垃圾 python
  • 详解JavaScript的垃圾回收机制
    目录为什么需要垃圾回收(GC)什么是垃圾回收垃圾产生垃圾回收策略引用计数标记循环引用引发的问题解决方法引用计数算法的优缺点标记清除算法核心思想标记清除算法优缺点标记整理算法V8引擎的...
    99+
    2022-11-12
  • 浅谈Java垃圾回收机制
    目录一.什么是垃圾二.怎么回收垃圾2.1 静态对象什么时候变成垃圾被回收2.2 新生代和年老代三、垃圾回收算法3.1 标记清除算法3.2 复制清除算法(专门用于处理年轻代垃圾的)3....
    99+
    2022-11-12
  • Java基础之垃圾回收机制详解
    目录一、GC的作用二、GC主要回收哪些内存三、分代回收四、垃圾回收器五、总结一、GC的作用 进行内存管理 C语言中的内存,申请内存之后需要手动释放;一旦忘记释放,就会发生内存泄漏! ...
    99+
    2022-11-13
  • Java垃圾回收机制的示例详解
    目录一、概述二、对象已死?1.引用计数算法2.可达性分析算法3.四种引用4.生存还是死亡?5.回收方法区三、垃圾收集算法1.分代收集理论2.名词解释3.标记-清除算法4.标记-复制算...
    99+
    2022-11-13
  • JVM垃圾回收器详解
    这篇文章主要介绍“JVM垃圾回收器详解”,在日常操作中,相信很多人在JVM垃圾回收器详解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JVM垃圾回收器详解”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!1 ...
    99+
    2023-06-02
  • 理解Python垃圾回收机制
    一.垃圾回收机制 Python中的垃圾回收是以引用计数为主,分代收集为辅。引用计数的缺陷是循环引用的问题。 在Python中,如果一个对象的引用数为0,Python虚拟机就会回收这个对象的内存。 #en...
    99+
    2022-06-04
    机制 垃圾 Python
  • PHP垃圾回收机制讲解
    PHP的垃圾回收机制 垃圾回收机制是一种动态存储分配的方案。它会自动释放程序不再需要的已分配的内存块。垃圾回收机制可以让程序员不必过分关心程序内存分配,从而将更多的精力投入到业务逻辑...
    99+
    2022-11-12
  • PHP的垃圾回收机制
      一、原理 php5和php7的垃圾回收机制都是利用引用计数。 二、php5和php7不同点 1、PHP5标量数据类型会计数,PHP7标量数据类型不再计数,不需要单独分配内存。 2、PHP7的zval 需要的内存不再是单...
    99+
    2016-04-04
    PHP的垃圾回收机制
  • Java垃圾回收机制怎么理解
    这篇文章主要讲解了“Java垃圾回收机制怎么理解”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java垃圾回收机制怎么理解”吧!Java垃圾回收是一个自动运行的管理程序运行时使用的内存的进程...
    99+
    2023-06-17
  • 怎么理解Java 垃圾回收机制
    怎么理解Java 垃圾回收机制,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。什么是自动垃圾回收自动垃圾回收是一种在堆内存中找出哪些对象在被使用,还有哪些对象没被使用,并且将...
    99+
    2023-06-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作