关于JVM的垃圾回收

news/2024/11/5 19:43:55/文章来源:https://www.cnblogs.com/kun1790051360/p/18528649

垃圾回收主要回收的是堆中的实例、数组。

STW(stop the world)暂停所有应用程序的线程,等待垃圾回收完成

 

1.对象什么时候可以被垃圾回收器回收

一个对象如果没有任何的引用指向他了,那么他现在就是不可达对象(垃圾),如果定位了垃圾,那么垃圾回收器就可能会将他回收。(比如这个对象被显式的设置为null,可以让垃圾回收器更好的识别他并回收)

定位垃圾有两种办法:

  • 引用计数法(不常用,循环引用会导致内存泄漏问题),
  • 可达性分析算法(常用,扫描堆内的对象,如果沿着GC root对象为起点的引用链找不到该对象,则表示该对象可以回收)
    • 可达性分析法有哪些可以作为GC root的对象
      • 虚拟机栈帧中的对象
      • metaspace中类静态属性引用的对象、常量引用的对象
      • native修饰的方法
         

2.JVM中的垃圾回收算法都有哪些

标记清除算法

  • 标记:根据可达性算法将得出的垃圾进行标记
  • 清除:对这些标记为可回收的对象进行垃圾回收
  • 清除和回收速度相对较快,但是会导致内存不完整,碎片化比较严重

标记整理算法(老年代常用算法)

  • 在标记清除算法的基础上,再将对象位置进行移动,虽然解决了碎片化问题,但是在性能上会有一定影响

复制算法(年轻代常用算法)

需要开辟两个大小完全相同的内存空间;

同样是通过gc root标志垃圾;在垃圾回收后,会将存活的对象复制到另一个区域,该区域全部清空。

在垃圾对象较多的情况下效率较高,而且无碎片化;但是需要分配两块内存空间,并且有一块在同一时间内是无法使用的

 

3.JVM中的分代回收

堆会进行区域划分:新生代(eden,幸存者区to,幸存者区from):老年代比例为1:2

对象分代回收策略:

  1. 新创建的对象都先分配到eden区;
  2. eden区内存不足时,会标记eden区与from区的存活对象
  3. 采用复制算法将存活对象复制到to中,复制完毕后释放eden和from区内存
  4. eden区内存再次不足时,标记eden区和to区存活对象,再次进行复制算法将其移动到from区,回到2
  5. 当幸存区对象经历多次回收(至多15次),会从新生代晋升为老年代。(幸存区内存不足或者大对象也会提前晋升)

 

4.MinorGC、MixedGC、fullGC的区别是什么

MinorGC(youngGC)发生在新生代的垃圾回收,暂停时间短(STW)

MixedGC发生在新生代+老年代部分区域的垃圾回收,由G1收集器持有

fullGC新生代+老年代完整的垃圾回收,STW时间很长,应极力避免

 

5.JVM都有哪些垃圾回收器

串行垃圾回收器:分为serial和serial old串行垃圾收集器,使用单线程进行垃圾回收,堆内存较小,适合个人电脑

  • serial作用于新生代,使用复制算法;serial old作用于老年代,使用标记-整理算法。垃圾回收时,只有一个线程在工作,其他线程都要STW,等待垃圾回收完成

并行垃圾回收器:分为parallel new和parallel old,JDK8默认使用该回收器

  • parallel new作用于新生代,使用复制算法;parallel old作用于老年代,使用标记-整理算法。与串行不同的是,并行回收是多个线程在工作,其他没什么不同....

CMS(并发)垃圾回收器concurrent mark sweep:主要针对老年代的垃圾回收器。停顿时间短,用户体验好;在进行垃圾回收时应用可以正常运行。有以下四个工作阶段

  • 初始标记:短暂的STW,标记一下GCroot关联的对象
  • 并发标记:标记出所有科可达对象
  • 重新标记:修正并发标记期间的变动,需要STW
  • 并发清楚:采用标记-清除法,会有内存碎片

G1垃圾回收器

G1和其他垃圾回收器的区别就是不再按默认的将堆分为新生代与老年代,而是将堆划分为多个大小相同的region,每一个region可以按需要来充当eden、survivor、old。也因此G1可以预测STW

JDK9之后默认垃圾回收器都是采用的G1。G1应用于老年代与新生代

划分了多个区域,每个区域都可以作为eden,survivor,old,humongous(专门存储大对象,如果一个存储空间不够的话他是会连续存储来实现humongous);采用复制算法。

如果垃圾回收速度赶不上新建对象速度会导致fullGC

有三个工作阶段:

  1. 年轻代垃圾回收
    1. 初始时,所有区域都处于空闲状态
    2. 刚刚创建对象时,会随机选择一些空间作为eden区
    3. 当eden区需要进行垃圾回收时,挑选一个空闲区作为survivor区,用复制算法复制存活对象,需暂停用户线程(这里的STW很短)
    4. eden区会和新的survivor通过复制算法合并成新的survivor区,其中较老的对象晋升至老年代
  2. 并发标记
    1. 当老年代占用内存超过阈值(默认45%)后,触发并发标记,无STW
  3. 混合垃圾回收
    1. 回收存活对象较少的老年代,和survivor区中的合并为新的old

 

6.强引用,软引用,弱引用,虚引用的区别

强引用:只有所有的GCroot都不通过强引用引用该对象,该对象才能被垃圾回收

软引用:SoftReference当触发一次垃圾回收时,下一次垃圾回收就会回收该对象

弱引用:WeakReference垃圾回收时,无论内存是否充足都会回收弱引用对象。ThreadLocal内存泄漏问题就是因为Entry extend WeakReference

虚引用:需配合引用队列使用,被引用对象回收时,会将虚引用入队,由Reference Handler线程调用相关方法释放内存。该引用主要用于跟踪对象被垃圾回收的状态

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多校A层冲刺NOIP2024模拟赛18

赛时电脑死了,恼了就没交。赛后交是155pts。 T1 是二分答案+三维前缀和check,T2 瞎写了个搜索。 T1 选彩笔(rgb) 将r,g,b看做三个维度。 答案显然有可二分性,直接二分答案。那么就转化为是否存在一个边长为\(mid\)三维正方体,其内部有大于\(k\)个点。 三维前缀和维护即刻…

# 20222309 2024-2025-1 《网络与系统攻防技术》实验四实验报告

1.实验内容 一、恶意代码文件类型标识、脱壳与字符串提取 对提供的rada恶意代码样本,进行文件类型识别,脱壳与字符串提取,以获得rada恶意代码的编写作者,具体操作如下: (1)使用文件格式和类型识别工具,给出rada恶意代码样本的文件格式、运行平台和加壳工具; (2)使用…

从0开始搭建自己的直播平台

本文讲述了如何从0开始,利用腾讯云的平台,快速搭建一个直播平台的过程。本文讲述了如何从0开始,利用腾讯云的平台,快速搭建一个直播平台的过程。 准备工作 要有两个已经备案完成的域名。 域名申请及备案的操作,这部分可以直接看腾讯云的文档,也可以等我后面有时间自己再写…

[Zer0pts2020]easy strcmp

[Zer0pts2020]easy strcmp die查壳找到加密函数如何找到加密函数的找到init函数,跟进funcs_889 、跟进使用x交叉引用qword_201090即可找到主加密函数 那这个加密函数是如何连上main函数的呢? mainmain函数这里运用了strcmp,但我们却找不到strcmp到底对比了什么 但根据我们刚…

LDAP--Jenkins详解笔记

一、Ldap的结构1.组织角色 所有用户都可以登录,但是只有创建时的admin组角色有增删改的权限,相当于是根目录,千万不能删,删了就全没了注意,admin用户是首个超级登录用户(相当于根),需要用配置文件生成,详见:https://www.cnblogs.com/wangyuanguang/p/18189832 ##注意…

系统集成项目管理工程师笔记4 - 第四章 信息系统架构

信息系统集成项目涉及的架构通常有系统架构、数据架构、技术架构、应用架构、网络架构、安全架构; 4.1 架构基础架构的本质是决策; 4.1.1 指导思想通过指导思想的贯彻实施,推动项目多元参与者能保持集成关键价值的一致性理解,从而减少不必要的矛盾与冲突;4.1.2 设计原则太…

举例说明什么情况下会更倾向于使用抽象类而不是接口

接口和抽象类都遵循”面向接口而不是实现编码”设计原则,它可以增加代码的灵活性,可以适应不断变化的需求。 接口 vs 抽象类 继承限制:Java 中,一个类只能继承一个类,但可以实现多个接口。 继承一个类意味着失去了继承其他类的机会。行为表示:接口通常用于表示附加的行为…

智慧测绘数字化管理平台建设方案

随着信息技术的飞速发展,测绘地理信息与遥感专业正经历着一场革命性的变革。智慧测绘数字化管理平台的建设,不仅能够提高测绘数据的准确性和实时性,还能为城市规划、环境保护、灾害预防等领域提供强有力的数据支持。本文将探讨智慧测绘数字化管理平台的建设方案,以期为相关…

劫持微信聊天记录并分析还原 —— 解密数据库(二)

程序以 Python 语言开发,可读取、解密、还原微信数据库并帮助用户查看聊天记录,还可以将其聊天记录导出为csv、html等格式用于AI训练,自动回复或备份等等作用。本工具设计的初衷是用来获取微信账号的相关信息并解析PC版微信的数据库。程序以 Python 语言开发,可读取、解密、…

2024newstarweb题解

w1 headach3会赢吗 源码flag碎片X1: ZmxhZ3tXQTB3 再次查看源码flag碎片X2: IV95NF9yM2Fs 第三个页面也是直接查看源码直接改源码flag碎片X3: MXlfR3I0c1B 下一个页面直接禁用jsflag碎片X4: fSkpKcyF9 ZmxhZ3tXQTB3IV95NF9yM2FsMXlfR3I0c1BfSkpKcyF9 base64解码即可的flag智械危…

判断一个数是不是质数(素数)

​public static boolean isPrime(int n){if (n <= 3) { return n > 1;) for(int i = 2; i < n; i++){if (n % i == 0) { return false;} ) return true;} 质数(也称为素数)是指在大于1的自然数中,除了1和它本身以外不再有其他因数的数。换句话说,质数只能被1和它…