三、GC算法垃圾回收器

news2024/9/29 23:35:37

文章目录

  • (持续更新中... ...CMS and G1)
  • 概述
  • 如何判断对象存活
    • 引用计数法
    • 根可达算法
  • GC算法(垃圾回收算法)
    • 分代收集理论
    • 标记-清除算法
    • 复制算法
    • 标记-整理算法
  • 垃圾回收器
    • 概述
    • Serial收集器
    • Parallel收集器
    • Parallel Old收集器
    • CMS收集器
    • G1收集器
  • 常用的收集器组合
  • 参考资料

(持续更新中… …CMS and G1)

概述

如何判断对象存活

引用计数法

在这里插入图片描述

根可达算法

在这里插入图片描述

which instances are root?
JVM stack,native method stack,run-time constant pool,static references in menthod area,Clazz

GC Roots的对象
1、在虚拟机栈(栈帧中的本地变量表)中引用的对象,如各个线程被调用的方法堆栈中使用到的参数、局部变量、临时变量等。
2、在方法区中类静态属性引用的对象,如Java类的引用类型静态变量。
3、在方法区中常量引用的对象,如字符串常量池(String Table)里的引用。
4、在本地方法栈中JNI(即通常所说的Native方法)引用的对象。
5、Java虚拟机内部的引用,如基本数据类型对应的Class对象,一些常驻的异常对象(比如NullPointExcepiton、OutOfMemoryError)等,还有系统类加载器。
6、所有被同步锁(synchronized关键字)持有的对象。
7、反映Java虚拟机内部情况的JMXBean、JVMTI中注册的回调、本地代码缓存等

STW
所有收集器在根节点枚举这一步骤时都是必须暂停用户线程“Stop The World”在分析过程中,根节点集合的对象引用关系必须保持不变,即使是号称停顿时间可控,或者(几乎)不会发生停顿的CMS、G1、ZGC等收集器,枚举根节点时也是必须要停顿。

OopMap
OopMap作用:快速找到GC ROOTS,当所有线程停下来的时候,并不需要一个不漏的检查完所有执行上下文和全局引用位置,虚拟机应该是有办法直接知道哪些地方存放着对象引用。在HotSpot的实现中,是使用一组称为OopMap的数据结构来达到目的的。
OopMap存储两种对象引用:1、对象内的引用。2、栈、寄存器中引用。

Safe Point
安全点就是程序能够停顿的位置。即程序不是在任何时候停顿下来进行GC,只有到了安全点才去更新OopMap和停顿,等待GC完成在继续执行。

GC算法(垃圾回收算法)

分代收集理论

在这里插入图片描述

标记-清除算法

标记-清除算法(Mark-Sweep)是最早出现也是最基础的垃圾收集算法,分为“标记”和“清除”两个阶段,从根集合(GC Roots)进行扫描,对存活的对象进行标记,标记完毕后,再扫描整个空间中未被标记的死亡对象进行回收标记回收。

主要缺点:
第一执行效率不稳定,如果Java堆中包含大量对象,而且其中大部分是需要被回收的,这时必须进行大量标记和清除的动作,导致标记和清除两个过程的执行效率都随对象数量增长而降低。
第二内存空间碎片化问题,标记、清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致当以后在程序运行过程中需要分配较大对象时无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。
在这里插入图片描述

复制算法

标记-复制算法(Semispace Copying):将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。

主要缺点:
第一Copying算法的效率跟存活对象的数目多少有很大的关系,如果存活对象很多,那么Copying算法的效率将会大大降低。
第二将可用内存缩小为了原来的一半,空间浪费。
在这里插入图片描述

标记-整理算法

标记-整理算法(Mark-Compact) 标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向内存空间一端移动,然后直接清理掉边界以外的内存。
主要缺点:
进过标记后如果有大量存活对象,移动存活对象,并更新所有引用这些对象的地方将会是一种极为负重的操作,而且这种对象移动操作必须全程暂停用户应用程序才能进行 (Stop The World)。
在这里插入图片描述

垃圾回收器

概述

垃圾收集器没有在任何规范中进行过多的规定,可以由不同的厂商,不同版本的JVM来实现。
由于JDK的版本处于高速迭代过程中,因此java发展至今已经衍生了众多的GC版本。

垃圾回收器分类
1、按线程数分,可分为串行垃圾回收器和并行垃圾回收器。
2、按工作模式分,可以分为并发式垃圾回收器和独占式垃圾回收器。
3、按碎片处理方式分,可分为压缩式垃圾回收器和非压缩式垃圾回收器。
4、按工作的内存空间分,可分为年起代垃圾收集器和老年代垃圾收集器。

评估GC的性能指标
1、吞吐量:运行用户代码的时间占总时间的比例 (总运行时间: 程序运行时间+内存回收时间)
2、垃圾收集开销:吞吐量的补数,垃圾收集器所用时间与总时间的比例
3、暂停时间:执行垃圾收集时,程序的工作线程被暂停的时间
4、收集频率:相对于应用程序的执行,收集操作发生的频率
5、内存占用:Java堆区所占的内存大小
6、快速:一个对象从诞生到被回收所经历的时间

这三者共同构成一个"不可能三角",三者总体的表现随着技术的进步越来越好,一款优秀的收集器通常最多同时满足其中两项。现在标准:在最大吞吐量优先的情况下,降低暂停时间。
吞吐量(throughput)
1、吞吐量就是CPU用于运行用户代码的时间与CPU总消耗时间的比值,即吞吐量 = 运行用户代码时间 / (运行用户代码时间 + 垃圾收集时间)
2、高吞吐量的情况下,应用程序能容忍较高的暂停时间,因此高吞吐量的应用程序由更长的时间基准,快速响应是不必考虑的
暂停时间(pause time)
1、暂停时间是指一个时间段内应用程序线程暂停,让GC线程执行的状态

如果说收集算法是内存回收的方法论,垃圾收集器就是内存回收的具体实现。
JDK1.8默认的垃圾回收:PS + ParallelOld。

Serial收集器

a stop-the-world,copying collertor which uses a single GC thread.
单CPU效率最高
虚拟机是Client模式的默认垃圾回收器。
在这里插入图片描述

Parallel收集器

在这里插入图片描述ParallelNew

  • a stop-the-world, copying collector which uses multiple GC threads.
  • it differs from “Parallel Scavenge” in that it has enhancements that make it usable with CMS.
  • For example, “ParNew” does the synchronization needed so that it can during the concurrent phases of CMS.
  • 默认线程数为CPU的核数。

Parallel Scavenge

  • a stop-the-world, copying collector which uses multiple GC threads.

ParallelNew vs Parallel Scavenge

  • PN响应时间优先。配合CMS使用。
  • PS吞吐量优先。
  • 延伸阅读:HotSpot Virtual Machine Garbage Collection Tuning Guide

Parallel Old收集器

在这里插入图片描述

CMS收集器

在这里插入图片描述
三色标记算法
CMS解决方案:Incremental Update
所以,CMS的remark阶段,必须从头扫描一遍。

JVM参数:
java -XX:+PrintFlagsFinal | more
java -XX:+PrintFlagsFinal | wc -l

G1收集器

在这里插入图片描述

常用的收集器组合

在这里插入图片描述

在这里插入图片描述

参考资料

  1. https://blogs.oracle.com/jonthecollector/our-collectors
  2. https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html
  3. http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp
  4. http://www.ityouknow.com/jvm/2017/08/29/GC-garbage-collection.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/398623.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32实战项目-串口打印

前言: 本小结主要实现串口打印功能,主要将上一结的状态机运行次数,通过串口在串口终端上打印出来,硬件电路上主要是TTL转USB驱动电路,软件上主要有状态机函数,串口发送函数等调试工具是串口助手。 目录 1…

机器学习学习记录1:假设空间

我们可以把学习过程看作一个在所有假设组成的空间中进行搜索的过程,搜索目标是找到与训练集"匹配" 的假设,即能够将训练集中的瓜判断正确的假设.假设的表示一旦确定,假设空间及其规模大小就确定了.对于西瓜问题,这里我们…

[MySQL索引]2.索引的底层原理(一)

索引的底层原理(一)B-树索引B树索引tips: ​ 通过使用malloc/new来申请4字节的内存,但是操作系统不是说每一次用户申请4字节内存,我就只分配4字节,这样申请次数多了就要涉及频繁的用户态和内核态的切换,开销…

AM5728(AM5708)开发实战之安装Debian 10桌面操作系统

一 环境搭建 准备一个SD卡启动卡,能够正常引导板卡启动,后续会把Debian 10镜像安装到SD卡ext4分区 准备两个U盘,一个格式化成fat32文件系统,另一个格式化成ext4文件系统 下载Debian 10镜像,镜像名字为debian-10.4.0-a…

【前端】一个更底层库React,附教程

Reat是什么?React在UI里最火的也是最好的库,React是一个做UI的库,具体来说是做UI组件的库,专注于做mvc中的v,它是一个更底层的工具库。为你应用的每一个状态设计简洁的视图,当数据变动时 React 能高效更新并…

Linux发行版本与发行版的简单的介绍

Linux linux下有很多发行的版本,或者称之为魔改版本。以下介绍一些常见的版本,以避免名词的混淆。 linux是提供了一个内核,就像是谷歌的内核一样,QQ浏览器就是使用的谷歌的内核,也算是一个发行版本。 Ubuntu&#x…

课程项目简介

一、深度学习模型入门 1&#xff0c;什么是机器学习&#xff1f; Study of algorithms that improve their performance P at some task T with experience E. 研究在某个任务T上用经验E提高其性能P的算法。 well-defined learning task:<P,T,E> 明确的学习任务&#…

手把手开发一门程序语言JimLang (2)

根据爱因斯坦的相对论&#xff0c;物体的质量越大&#xff0c;时间过得越快&#xff0c;所以托更对于我的煎熬&#xff0c;远远比你们想象的还要痛苦…今天给大家来盘硬菜&#xff0c;也是前些时日预告过的JimLang的开发过程… Let’s go !!! 语法及解析 JimLang.g4 这里我们…

轮毂要怎么选?选大还是选小?

随着改装车的越来越火爆&#xff0c;汽车轮毂可选择的款式也越来越多&#xff0c;90%的人换轮毂&#xff0c;首先选的就是外观。大轮毂的款式多&#xff0c;外形大气好看&#xff0c;运动感十足&#xff0c; 那是不是选大轮毂就可以呢&#xff1f;不是的&#xff0c;汽车轮毂要…

全面吃透Java Stream流操作,让代码更加的优雅

文章目录1 认识Stream流1.1 什么是流1.2 流与集合1.2.1 流只能遍历一次1.2.2 外部迭代和内部迭代1.3 流操作1.3.1 中间操作1.3.2 终端操作1.3.3 使用流2 学会使用Stream流2.1 筛选和切片2.1.1 用谓词筛选2.1.2 筛选各异的元素2.1.3 截短流2.1.4 跳过元素2.2 映射2.2.1 map方法2…

Java经典面试题——对比 Vector、ArrayList、LinkedList 有何区别?

典型回答 这三者都是实现集合框架中的 List &#xff0c;也就是所谓的有序集合&#xff0c;因此具体功能也比较近似&#xff0c;比如都提供按照位置进行定位、添加或者删除的操作&#xff0c;都提供迭代器以遍历其内容等。但因为具体的设计区别&#xff0c;在行为、性能、线程…

详解CRC原理以及C语言实现

CRC检验原理 CRC&#xff08;Cyclic Redundancy Check&#xff09;校验是一种常用的数据校验方法&#xff0c;它通过计算数据的校验码来检测数据在传输过程中是否出现了错误。 CRC校验的基本原理是将数据按照一定的规则进行计算&#xff0c;得到一个固定长度的校验码&#xf…

JavaScript内改变this指向

之前我们说的都是代码内 this 的默认指向 今天我们要来说一下如何能改变 this 指向 也就是说, 你指向哪我不管, 我让你指向哪, 你就得指向哪 开局 在函数的原型( Function.prototype ) 上有三个方法 call apply bind 既然是在函数的原型上, 那么只要是函数就可以调用这三个方…

React(七):Router基本使用、嵌套路由、编程式导航、路由传参、懒加载

React&#xff08;七&#xff09;一、React-Router的基本使用1.安装和介绍2.路由的配置和跳转3.Navigate的使用4.如果找不到对应的路由路径&#xff1f;二、嵌套路由的用法三、编程式路由导航1.类组件中使用useNavigate2.函数式组件中使用useNavigate四、路由跳转传参1.设置好路…

小白学Pytorch 系列--Torch API(1)

小白学Pytorch 系列–Torch API Torch version 1.13 Tensors TORCH.IS_TENSOR 如果obj是PyTorch张量&#xff0c;则返回True。 注意&#xff0c;这个函数只是简单地执行isinstance(obj, Tensor)。使用isinstance 更适合用mypy进行类型检查&#xff0c;而且更显式-所以建议使…

【计组】主存储器有关知识梳理

一、主存储器 主存储器可以直接和CPU进行通信&#xff0c;但是只能保存临时数据&#xff0c;在断电后数据就消失。还有一个特点是&#xff0c;主存储器的容量小&#xff0c;速度快&#xff0c;造价高。 1.构成 2.主存中存储体的构造 最小的存储单位是存储元&#xff0c;存储元…

近亿美元:人工心脏龙头永仁心医疗完成超大额A轮融资

近日&#xff0c;永仁心医疗器械有限公司&#xff08;以下简称“永仁心医疗”&#xff09;完成近一亿美元A轮融资&#xff0c;由北京科兴中维生物技术有限公司&#xff08;SINOVAC科兴&#xff09;领投&#xff0c;太平&#xff08;深圳&#xff09;医疗健康产业私募股权投资基…

腾讯IM h5版本,在安卓原生和IOS原生支持情况的调查以及踩坑、解决办法

介绍 公司准备基于腾讯IM进行开发即时通讯功能&#xff0c;想用H5来开发&#xff0c;这样方便以后移植&#xff0c;在原生app里直接加载&#xff0c;通过三天时间的调查&#xff0c;以及与腾讯客服&#xff0c;技术来回沟通&#xff0c;已经有一定的成果&#xff0c;现将调查成…

【Redis】Redis持久化(一)

目录 1.Redis持久化 1.1.RDB持久化 1.1.1.执行时机 1.1.2.RDB原理 1.1.3.小结 1.2.AOF持久化 1.2.1.AOF原理 1.2.2.AOF配置 1.2.3.AOF文件重写 1.3.RDB与AOF对比 1.Redis持久化 Redis有两种持久化方案&#xff1a; RDB持久化 AOF持久化 1.1.RDB持久化 RDB全称Red…

SpringBoot - 什么是跨域?如何解决跨域?

什么是跨域&#xff1f; 在浏览器上当前访问的网站&#xff0c;向另一个网站发送请求&#xff0c;用于获取数据的过程就是跨域请求。 跨域&#xff0c;是浏览器的同源策略决定的&#xff0c;是一个重要的浏览器安全策略&#xff0c;用于限制一个 origin 的文档或者它加载的脚本…