我的编程空间,编程开发者的网络收藏夹
学习永远不晚

java中的垃圾回收机制以及经典垃圾回收器的详细介绍

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

java中的垃圾回收机制以及经典垃圾回收器的详细介绍

本篇内容介绍了“java中的垃圾回收机制以及经典垃圾回收器的详细介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

判断对象存活方法

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

会有对象循环引用问题:

objA.instance = objBobjB.instance = objA

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

可达性分析:

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

GC Roots的根对象为:

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

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

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

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

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

6)被同步锁持有的对象

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

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

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

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

三色法分析图:

java中的垃圾回收机制以及经典垃圾回收器的详细介绍

黑色:已经扫描过的对象

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

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

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

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,基于标记整理算法。

java中的垃圾回收机制以及经典垃圾回收器的详细介绍

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

缺点:stop the world

ParNew收集器

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

java中的垃圾回收机制以及经典垃圾回收器的详细介绍

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

Parallel Scavenge收集器

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

java中的垃圾回收机制以及经典垃圾回收器的详细介绍

CMS 垃圾收集器

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

步骤:

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

java中的垃圾回收机制以及经典垃圾回收器的详细介绍

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。

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

java中的垃圾回收机制以及经典垃圾回收器的详细介绍

“java中的垃圾回收机制以及经典垃圾回收器的详细介绍”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

java中的垃圾回收机制以及经典垃圾回收器的详细介绍

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

下载Word文档

猜你喜欢

java中的垃圾回收机制以及经典垃圾回收器的详细介绍

本篇内容介绍了“java中的垃圾回收机制以及经典垃圾回收器的详细介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!判断对象存活方法引用计数法
2023-06-20

简单介绍Java垃圾回收机制

Java的内存分配与回收全部由JVM垃圾回收进程自动完成。与C语言不同,Java开发者不需要自己编写代码实现垃圾回收。这是Java深受大家欢迎的众多特性之一,能够帮助程序员更好地编写Java程序。这篇教程是系列第一部分。首先会解释基本的术语
2023-05-30

Java中的垃圾回收机制是如何工作的?如何优化Java的垃圾回收?(Java的垃圾回收器如何运作?有哪些策略可以优化Java的垃圾回收性能?)

Java垃圾回收机制通过根引用扫描、图遍历、标记和清除过程回收不再使用的对象。优化策略包括减少对象分配、使用大对象、避免循环引用、调整GC参数和使用最新JVM版本。监控GC性能并根据特定需求优化策略至关重要。
Java中的垃圾回收机制是如何工作的?如何优化Java的垃圾回收?(Java的垃圾回收器如何运作?有哪些策略可以优化Java的垃圾回收性能?)
2024-04-02

Java 垃圾回收机制的原理究竟是什么?(java垃圾回收机制的原理是什么)

在Java编程中,垃圾回收机制是一个非常重要的概念。它负责自动管理内存,回收不再被引用的对象,以避免内存泄漏和提高程序的性能。本文将详细介绍Java垃圾回收机制的原理。一、什么是垃圾回收垃圾回收是一种自动内存管理技术,它
Java 垃圾回收机制的原理究竟是什么?(java垃圾回收机制的原理是什么)
Java2024-12-22

JAVA虚拟机(JVM)详细介绍(三)——垃圾收集机制

在上一篇中我们说过,自动内存管理分为两部分:给对象分配内存和回收分配给对象的内存。这篇我们说说后者,即回收分配给对象的内存。回收内存要用到垃圾收集机制,英文名儿是GC(Garbage Collection)。在本部分我们要解决如下几个问题:1、哪些内存需要回收
JAVA虚拟机(JVM)详细介绍(三)——垃圾收集机制
2017-01-27

php中的垃圾回收机制及其对性能的影响介绍

本篇内容主要讲解“php中的垃圾回收机制及其对性能的影响介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“php中的垃圾回收机制及其对性能的影响介绍”吧!垃圾回收是什么东西?在使用 C 语言的时
2023-06-20

PHP中垃圾回收机制的面试题

这篇文章将为大家详细讲解有关PHP中垃圾回收机制的面试题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。介绍一下PHP的垃圾回收机制PHP使用了引用计数(reference counting)GC机制,同时
2023-06-15

PHP中的垃圾回收机制是什么

这篇文章主要讲解了“PHP中的垃圾回收机制是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PHP中的垃圾回收机制是什么”吧!相信只要入门学习过一点开发的同学都知道,不管任何编程语言,一个
2023-06-20

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录