GC相关的

news2025/1/10 16:47:13

1、判断对象是否为垃圾的算法

  • 引用计数算法
  • 可达性分析算法

引用计数算法

判断的标准:

通过判断对象的引用数量来决定对象是否可以被回收。

每个对象实例都有一个引用计数器,被引用则+1,完成引用则-1。

任何引用计数为0的对象实例可以被当作垃圾收集。

优点: 执行效率高,程序执行受影响较小

缺点: 无法检测岀循环引用的情况,导致内存泄露

可达性算法:

通过判断对象的引用链是否可达来决定对象是否可以被回收

请添加图片描述

可以用作GC Root的对象?

  • 虚拟机栈中引用的对象(栈帧中的本地变量表)
  • 方法区中的常量引用的对象
  • 方法区中的类静态属性引用的对象
  • 本地方法栈中JNI(Native方法)的引用对象
  • 活跃线程的引用对象

2、垃圾回收算法

标记—清除算法(Mark and Sweep)

标记: 从根集合进行扫描,对存活的对象进行标记

清除: 对堆内存从头到尾进行线性遍历,回收不可达对象内存

请添加图片描述

缺点: 会导致碎片化。

复制算法(Copying)

  • 分为对象面和空闲面
  • 对象在对象面上创建
  • 存活的对象被从对象面复制到空闲面
  • 将对象面所有对象内存清除

请添加图片描述

优点:

  • 解决碎片化问题
  • 顶序分配内存,简单高效
  • 适用于对象存活率低的场景

标记—整理算法(Compacting)(老年代)

标记:从根集合进行扫描,对存活的对象进行标记。

清除:移动所有存活的对象,且按照内存地址次序依次排列,然后将末端内存地址以后的内存全部回收。

请添加图片描述

优点:

  • 避免内存的不连续行
  • 不用设置两块内存互换
  • 适用于存活率高的场景

分代收集算法(Generational Conllector)

垃圾回收算法的组合拳

按照对象生命周期的不同划分区域以采用不同的垃圾回收算法

目的:提高JVM的回收效率

GC的分类:

Minor GC:(新生代清除算法)

Full GC:(老年代清除算法)

  • Minor GC 是清除新生代。
  • Major GC 是清理永久代。
  • Full GC 是清理整个堆空间—包括年轻代和永久代。

请添加图片描述

当达到15岁以后,会存到老年代,或者Eden区和Survivor装不下,也会到老年代

对象如何晋升到老年代

  • 经历一定 Minor次数依然存活的对象
  • Survivor区中存放不下的对象

新生成的大对象(-XX+ Pretenuer Size threshold)(达到15岁以后)

—XX:Survivorratio:Eden和 Surviⅳor的比值,默认8:1。

—XX:Newratio:老年代和年轻代内存大小的比例。

—XX:MaxTenuringThreshold:对象从年轻代晋升到老生代经过GC次数的最大阈值。

老年代:(存放声明周期较长的对象)

使用算法:

标记—清理算法

标记—整理算法

对整个堆内存进行垃圾回收:

Full GC 和Major GC

Full GC比 Minor GC慢,10倍左右,但执行频率低

触发Full GC的条件

  • 老年代空间不足。
  • 永久代空间不足。
  • CMS GC时出现 promotion failed,concurrent mode failure
  • Minor GC晋升到老年代的平均大小大于老年代的剩余空间
  • 调用 System.gc()
  • 使用RMI来进行RPC或管理的JDK应用,每小时执行1次Full GC

3、分代收集算法(Generational Collector)

Stop-the-World(停止服务)

  • JVM由于要执行GC而停止了应用程序的执行
  • 任何一种GC算法中都会发生
  • 多数GC优化通过减少stop-the-world发生的时间来提高程序性能

Safepoint(安全位置)

  • 分析过程中对象引用关系不会发生变化的点。
  • 产生 Safepoint的地方:方法调用;循环跳转;异常跳转等。
  • 安全点数量得适中。

常见的垃圾收集器

JVM的运行模式:

Server:重量级虚拟机,启动慢,但是启动后快。

Client:轻量级虚拟机,奇动快,但是启动后慢。

java -version

请添加图片描述

垃圾收集器之间的联系

年轻代常见的垃圾收集器

Seria收集器(-XX:+ Use SerialGC,复制算法)

单线程收集,进行垃圾收集时,必须暂停所有工作线程。

简单高效,Client模式下默认的年轻代收集器。

几十至几百兆基本需要几十到几百毫秒。可以忍受。

请添加图片描述

ParDew收集器(-XX+ Use ParNewGC,复制算法)

多线程收集,其余的行为、特点和 Seria收集器一样。

单核执行效率不如 Serial,在多核下执行才有优势。

开启的线程数和你的CPU核数相关。

请添加图片描述

Parallel Scavenge收集器(-XX:+ UseParallelgc,复制算法)

比起关注用户线程停顿时间,更关注系统的吞吐量。

在多核下执行才有优势,Server模式下默认的年轻代收集器。

吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)

请添加图片描述

4、老年代常见的垃圾收集器

Serial Old收集器(-XX:+UseSerialOldGC,标记—整理算法)

  • 单线程收集,进行垃圾收集时,必须暂停所有工作线程。
  • 简单高效,Client模式下默认的老年代收集器。

请添加图片描述

Parallel old收集器(-XX:+UseParalleloldgC,标记-整理算法)

多线程,吞吐量优先。

CMS收集器(-XX+ Use ConcMarkSweepGC,标记清除算法)(最主要的)

几乎能与用户线程同时工作(减少停顿时间)

回收的步骤:(1.4会让JVM停止工作)

  1. 初始标记:stop-the-world
  2. 并发标记:并发追溯标记,程序不会停顿
  3. 并发预清理:查找执行并发标记阶段从年轻代晋升到老年代的对象
  4. 重新标记:暂停虚拟机,扫描CMS堆中的剩余对象
  5. 并发淸理:清理垃圾对象,程序不会停顿
  6. 并发重置:重置CMS收集器的数据结构

CMS有3个明显的缺点:

  1. CMS收集器对CPU资源非常敏感。
  2. CMS收集器无法处理浮动垃圾,可能会出现“Concurrent Mode Failure”失败而导致另一次Full GC产生。(浮动垃圾:GC期间产生的垃圾,无法在当次收集中处理掉它们,只能留在下一次GC时再清理掉。)
  3. CMS会产生大量空间碎片

G1收集器(既用于年轻代,又用于老年代)(-XX:+UseG1GC,复制+标记-整理算法)

  • 并行和并发(使用多个CPU)
  • 分代收集
  • 空间整合(标记整理算法)
  • 可预测的停顿

特点:

将整个Java堆划分为多个大小相等的Region。

年轻代和老年代不再物理隔离。

请添加图片描述

5、GC相关的面试题

1)Object的finalize()方法的作用是否与C++的析构函数作用相同

  • 与C++的析构函数不同,析构函数调用确定,而它的是不确定的。
  • 将未被引用的对象放置于 F-Queue队列。
  • 方法执行随时可能会被终止。
  • 给予对象最后一次重生的机会。
  • obje的finalize()不会立即终止,还需要进行2次标记,c++中析构函数,会立即终止。

2)、Java中的强引用,软引用,弱引用,虚引用有什么用?

强引用:(Strong Reference)

  • 最普遍的引用:Object obj= new Object()。
  • 抛出 OutofMemoryError(内存溢出)终止程序也不会回收具有强引用的对象。
  • 通过将对象设置为nu来弱化引用,使其被回收。

软引用:(Soft Reference)

  • 对象处在有用但非必须的状态
  • 只有当内存空间不足时,GC会回收该引用的对象的内存
  • 可以用来实现高速缓存

String str = new String(“abc”);

SoftReference softReference = new SoftReference<>(str);

弱引用:(Weak Reference)

  • 非必须的对象,比软引用更弱一些。
  • GC时会被回。
  • 被回收的概率也不大,因为GC线程优先级比较低。
  • 适用于引用偶尔被使用且不影响垃圾收集的对象。

String str = new String(“abc”);

WeakReference weakReference = new WeakReference<>(str);

虚引用:(PhantomReference)

  • 不会决定对象的生命周期
  • 仼何时候都可能被垃圾收集器回收
  • 跟踪对象被垃圾收集器回收的活动,起哨兵作用
  • 必须和引用队列 Reference Queue联合使用

String str = new String(“abc”);

ReferenceQueue queue = new ReferenceQueue<>();

PhantomReference ref = new PhantomReference<>(str, queue);

四种引用的区别?

强引用>软引用>弱引用>虚引用

请添加图片描述

类层次结构

请添加图片描述

引用队列(Reference Queue)

  • 无实际存储结构,存储逻辑依赖于内部节点之间的关系来表达。
  • 存储关联的且被GC的软引用,弱引用以及虚引用。

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

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

相关文章

操作系统-I/O管理-I/O系统(设备独立性软件)

目录 一、假脱机技术(SPOOLing技术) 二、设备的分配与回收 2.1设备分配考虑因素 设备的固有属性 设备分配算法 设备分配中的安全性 2.2静态分配和动态分配 2.3设备分配管理中的数据结构 DTC COCT CHCT SDT 三、缓冲区管理 3.1单缓冲 3.2 双缓冲 ​3.2循环缓冲 3.…

1746_Perl中面向对象的目录处理模块

全部学习汇总&#xff1a; GreyZhang/perl_basic: some perl basic learning notes. (github.com) 说起来我还不懂Perl的面向对象编程技术&#xff0c;只是在前阵子看到了书中提到了一句&#xff0c;用到了一个例子。今天看书的时候又看到了类型形势的代码&#xff08;代码中很…

25利用 灰色预测模型预测发电量(附matlab程序)

1.简述 学习目标&#xff1a; 灰色预测模型预测发电量 根据原始发电量数据预测需要年份的发电量 发电量预测是电力系统规划与运行的基础,是电力市场运作中的重要组成部分.目前,对发电量预测的研究已经比较深入,常用的发电量预测方法有:灰色预测法,线性回归模型,自回归移动平均模…

软件测试(1)

软件测试就是用来验证产品特性是否满足用户需求 调试是发现并解决软件中的缺陷 开发人员编码阶段进行 测试是用来发现软件中的缺陷 测试人员&#xff0c;开发人员&#xff08;单元测试&#xff0c;集成测试&#xff09; 测试贯穿于整个软件的生命周期&#xff0c;但是调…

免费在线压缩图片的网站

1. TinyPNG - 这是一个非常受欢迎的在线图片压缩网站,可以压缩 PNG 和 JPG 图片,保证无损压缩。 网址&#xff1a;TinyPNG – Compress WebP, PNG and JPEG images intelligently 2. Compressor.io - 这也是一个很好的在线图片压缩工具,可以批量上传和压缩图片,支持 PNG, JPG 和…

逆向Android开发工程,抓包!抓包!学习哪里?

抓包是什么&#xff1f; 在Android逆向工程中&#xff0c;抓包是一项重要的技术&#xff0c;用于获取手机应用程序与服务器之间的通信数据。通过抓包&#xff0c;可以分析应用程序的网络请求&#xff0c;获取请求的URL、参数、响应数据等信息&#xff0c;对应用程序的行为进行…

JavaSE进阶--注解

文章目录 前言一、概念二、使用实例1、Junit测试中2、JDK内置注解 三、自定义注解1、注解声明2、注解配置参数2.1 配置参数的类型&#xff1a;2.2 注意2.3 两个概念 3、使用注解 四、元注解1、Retention1.1 RetentionPolicy.SOURCE1.2 RetentionPolicy.CLASS1.3 RetentionPolic…

千万不要在简历里写精通C++,没人能真正精通C++

任何说自己很懂C的人可能都是在夸大其词。 我想你可能已经注意到了&#xff0c;是的&#xff0c;今天的大多数程序员都在使用Python、Rust、Go或是其他新的编程语言。大部分人已经不再需要掌握C、C等古老的编程语言了&#xff0c;甚至很多程序员已经从手动编码开始向AI编码转型…

el-select 触底分页+远程搜索

文章目录 前言一、el-select 触底分页远程搜索1.封装触底自定义指令2.在 mian.js 引入封装好的自定义指令3.在组件中进行使用 总结 前言 大部分情况下使用 el-select 的时候&#xff0c;el-options 中 options 的值都是后端接口给的数据&#xff0c;直接赋值就可以了。但是有的…

(8版本)mysql数据库安装教程(自用保存)

博主简介&#xff1a;想进大厂的打工人博主主页&#xff1a;xyk:所属专栏: mysql 参考csdn大神们的文章&#xff0c; 总结出来的详细用法~~~ 目录 文章目录 一、下载MySQL8.0.33 二、配置初始化文件my.ini(重点) 三、初始化MySQL 四、安装MySQL服务并启动 修改密码 4.1 安装…

akima 插值拟合算法 Python/C++版本

目录 前言Akima简介Akima优势 算法的代码实现python版C 版代码解析1代码解析2代码解析3 结果测试 前言 鉴于CSDN上Akima算法文章大部分要VIP观看或者下载&#xff0c;即使是付费也有质量不佳&#xff0c;浪费Money也浪费时间。 笔者更具查到的资料分享给大家。 Akima简介 Ak…

C++技能系列 ( 5 ) - 详解函数入参/返回参使用(值传递/引用传递/指针传递/智能指针传递)

系列文章目录 C技能系列 Linux通信架构系列 C高性能优化编程系列 深入理解软件架构设计系列 高级C并发线程编程 期待动动小手&#xff0c;点击关注哦&#xff01;&#xff01;&#xff01; 当你休息的时候&#xff0c;一定要想到别人还在奔跑。 When you rest, we must thin…

数据库相关

1、主要考点思维导图 2、如何设计一个关系型数据库 存储管理&#xff1a;数据逻辑关系转为物理存储关系。 缓存机制&#xff1a;优化执行效率。 SQL解析&#xff1a;将Sql语句进行解析。 日志管理&#xff1a;记录操作。 权限划分&#xff1a;多用户管理。 容灾机制&…

2、瑞丽-伯纳德对流的拉格朗日拟序结构(FTLE场结果对比)

在上篇博客中&#xff0c;我简单比较了瑞丽伯纳德对流的FTLE场&#xff0c;但是因为粒子追踪采用的是欧拉方法&#xff0c;所以精度不是很高&#xff0c; 因此与文献中的结果还是有些差别。 下面放一张文献中的FTLE场&#xff0c;参数与上篇文章是一致的&#xff0c;Ra 1e8;Pr…

《面试1v1》SpringBean生命周期

&#x1f345; 作者简介&#xff1a;王哥&#xff0c;CSDN2022博客总榜Top100&#x1f3c6;、博客专家&#x1f4aa; &#x1f345; 技术交流&#xff1a;定期更新Java硬核干货&#xff0c;不定期送书活动 &#x1f345; 王哥多年工作总结&#xff1a;Java学习路线总结&#xf…

python:使用Scikit-image对遥感影像进行边缘检测(edges)

作者:CSDN @ _养乐多_ 本文将介绍使用Scikit-image库中用于边缘检测特征提取的一些方法及其代码。方法包括 Canny边缘检测(canny),Sobel边缘检测(sobel),Scharr边缘检测(scharr), Roberts边缘检测(roberts),Prewitt边缘检测(prewitt),Farid边缘检测(farid),…

HJ48 从单向链表中删除指定值的节点

描述 输入一个单向链表和一个节点的值&#xff0c;从单向链表中删除等于该值的节点&#xff0c;删除后如果链表中无节点则返回空指针。 链表的值不能重复。 构造过程&#xff0c;例如输入一行数据为: 6 2 1 2 3 2 5 1 4 5 7 2 2 则第一个参数6表示输入总共6个节点&am…

Day24 实战篇 ——Jmeter通过JDBC测试实战

Day24 实战篇 ——Jmeter通过JDBC测试实战 文章目录 Day24 实战篇 ——Jmeter通过JDBC测试实战1、**业务级脚本开发**2、**接口级脚本开发**3、**JDBC脚本开发**4、**JMS Point-to-Poibt脚本开发**5、**Jmeter轻量级接口自动化测试框架**(了解就行)1、业务级脚本开发 登录脚…

《2023 年 React 生态》

大家好&#xff0c;我是 Chocolate。 前不久看到一篇不错的内容&#xff0c;来自于 The React Ecosystem in 2023&#xff0c;也结合自己今年使用的 React 生态总结一下。 本文并非视频演讲稿&#xff0c;和视频内容还是有一点点区别&#xff0c;视频内容相对来说会更加详细一…

ffmpeg(一) ffmpeg+QT开发环境搭建

1、开发库的选择 &#xff08;1&#xff09;音视频开发库 每个主流平台基本都有自己的音视频开发库&#xff08;API&#xff09;&#xff0c;用以处理音视频数据&#xff0c;比如&#xff1a; iOS&#xff1a;AVFoundation、AudioUnit 等 Android&#xff1a;MediaPlayer、Me…