1.什么是垃圾回收?如何触发垃圾回收? 

垃圾回收(GC)是自动管理内存的一种机制,它负责自动释放不再被程序引用的对象所占用的内存,这种机制减少内存泄漏和内存管理错误的可能性。可以通过多种方式触发:

  • 内存不足时:当JVM检测到堆内存不足,无法为新的对象分配内存时,会自动触发垃圾回收。
  • 手动请求:虽然垃圾回收是自动的,开发者可以通过调用System.gc()或Runtime.getRuntime().gc()建议JVM进行垃圾回收。不过这只是一个建议,并不能保证立即执行。
  • JVM参数:启动java程序时可以通过JVM参数来调整垃圾回收的行为,比如:-Xmx(最大堆大小)、-Xms(初始堆大小)等。
  • 对象数量或内存使用达到阈值:垃圾收集器内部实现了一些策略,以监控对象的创建和内存使用,达到某个阈值时触发垃圾回收。

2.垃圾判断方法

  • 引用计数法
    原理:为每个对象分配一个引用计数器,每当有一个地方引用它时,计数器加1;当引用失效时,计数器减1。当计数器为0时,表示对象不再被任何变量引用,可以被回收。
    缺点:不能解决循环引用的问题,即两个对象相互引用,但不再被其他任何对象引用,这时引用计数器不会为0,导致对象无法被回收
  • 可达性分析法
    原理:从一组称为GC Roots(垃圾收集根)的对象出发,向下追溯它们引用的对象,以及
    这些对象引用的其他对象,以此类推。如果一个对象到GC Roots没有任何引用链相连(即从GC Roots到这个对象不可达),那么这个对象就被认为是不可达的,可以被回收。
    GCRoos对象包括:虚拟机栈中引用的对象、方法区中类静态属性引用的对象、本地方法栈中JNl引用的对象、活跃线程的引用等。
    例:
    class A {B b;
    }
    class B {C c;
    }
    class C {无任何引用
    }
    public class GCTest {public static void main(String[] args) {A a = new A();a.b = new B();a.b.c = new C();// 在此时,a, b, c 这些对象都被 GC Roots 引用,暂时不会被回收。}
    }//若a=null,那么a和gc root引用断开,那么a、b和c就无法到达gc root,不可达,会被回收。
    

3. 垃圾回收算法

  • 标记-清除算法
    标记清除算法分为“标记”和"清除”两个阶段,首先通过可达性分析,标记出所有需要回收的对象,然后统一回收所有被标记的对象。标记清除算法有两个缺陷,一是标记和清除的过程效率都不高,二是清除结束后会造成大量的碎片空间。有可能会造成在申请大块内存的时候因为没有足够的连续空间导致再次GC。
  • 复制算法
    为了解决碎片空间的问题,出现了“复制算法”。复制算法的原理是,将内存分成两块,每次申请内存时都使用其中的一块,当内存不够时,将这一块内存中所有存活的复制到另一块上。然后将然后再把已使用的内存整个清理掉。复制算法解决了空间碎片的问题。但是也带来了新的问题。因为每次在申请内存时只能使用一半的内存空间,内存利用率严重不足。
  • 标记-整理算法
    复制算法在GC之后存活对象较少的情况下效率比较高,但如果存活对象比较多时,会执行较多的复制操作,效率就会下降。而老年代的对象在GC之后的存活率就比较高,所以就有人提出了“标记整理算法”。标记整理算法的“标记”过程与”标记-清除算法”的标记过程一致,但标记之后不会直接清理。而是将所有存活对象都移动到内存的一端,移动结束后直接清理掉剩余部分。
  • 分代回收算法
    分代收集是将内存划分成新生代和老年代。分配的依据是对象的生存周期或者说经历过的GC次数。对象创建时,一般在新生代申请内存,当经历一次GC之后如果对还存活,那么对象的年龄+1。当年龄超过一定值(默认是15,可以通过参数XX:MaxTenuringThreshold来设定)后,如果对象还存活,那么该对象会进入老年代。

3. 垃圾回收器

5. 垃圾回收机制

5.1 Minor GC

Minor GC主要负责回收年轻代的垃圾对象。年轻代通常分为三个区域:一个伊甸区和两个幸存区(一般称为From区和To区)。当对象被创建时,先被分配到伊甸区。在年轻代的垃圾回收过程中,先对伊甸区进行垃圾回收,将存活的对象复制到一个空闲的幸存区中(通常是From区),同时清空伊甸区。Minor GC会一直重复这样的过程,直到From区被填满,则进入To区,To区被填满之后,则将所有对象移动到老年代中。 

经历 16 次 Minor GC 还能在新生代中存活的对象,才会被送到老年代,或者Survivor 空间中某个年龄段的对象总大小超过了 Survivor 空间的一半,那么该年龄段及以上年龄段的所有对象都会在下一次垃圾回收时被晋升到老年代。

  • 作用范围:针对年轻代进行回收,包括Eden区和两个Survivor区(S0和S1)。
  • 触发条件:当Eden区空间不足时,JVM触发一次Young GC,将Eden区和一个Survivor区中的存活对象移动到另一个Survivor区或老年代。
  • 特点:通常发生的非常频繁,因为年轻代中对象的生命周期较短,回收效率高,暂停时间相对较短。

5.2 Major GC

Major GC是指对老年代进行的垃圾回收操作。在Java堆内存中,老年代用于存放生命周期较长的对象或者经过多次Minor GC后仍然存活的对象。Major GC的执行时间一般比Minor GC更长,因为它需要处理较多的对象和进行更复杂的内存整理操作。在Major GC期间,应用程序的执行将会暂停,直到垃圾回收操作完成。

  • 作用范围:针对老年代进行回收,但不一定只回收老年代。
  • 触发条件:当老年代空间不足时,或者系统检测到年轻代对象晋升到老年代的速度过快,可能会触发Major GC。
  • 特点:相比Minor GC,Major GC发生的频率较低,但每次回收可能需要更长的时间,因为老年代中的对象存活率较高。

5.3 Full GC

当新生代空间不足时,会触发Minor GC,只清理新生代内存。而老年代空间不足或者为了整理碎片化的内存,会触发Full GC,对整个堆内存进行回收。

Full GC 可能会导致较长的停顿时间,因为它需要扫描整个堆内存,标记可回收对象,并进行内存整理。这意味着在 Full GC 过程中,应用程序的执行会被暂停。

Full GC 的频率会受多种因素影响,如堆内存的大小、JVM配置参数、对象分配速度等。如果 Full GC 发生过于频繁或耗时过长,可能会导致应用程序的性能下降。

  • 作用范围:对整个堆内存(包括年轻代、老年代以及永久代/元空间)进行回收。
  • 触发条件:
    1. 直接调用System.gc()或Runtime.getRuntime().gc()方法时,虽然不能保证立即执行,但JVM会尝试执行Full GC。
    2. Minor GC时,如果存活的对象无法全部放入老年代,或者老年代空间不足以容纳存活的对象,则会触发FuGC,对整个堆内存进行回收。
    3. 当永久代(Java8之前的版本)或元空间(Java8及以后的版本)空间不足时。
  • 特点:Full GC是最昂贵的操作,因为它需要停止所有的工作线程(Stop The World),遍历整个堆内存来查找和回收不再使用的对象,因此应尽量减少Full GC的触发。

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

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

相关文章

更智能的零售终端设备管理:合规、安全与高效

目录 引言:为什么零售连锁和自助终端需要更智能的设备管理? 典型应用场景 1. 便利店连锁 2. 大型超市 3. 加油站 4. 自助终端 核心功能,驱动高效与安全 1. 批量配置 2. 定时策略同步 3. 设备状态监控 4. Kiosk 模式,保…

Elasticsearch:向量搜索过滤 - 保持相关性

作者:来自 Elastic Carlos Delgado 仅执行向量搜索以找到与查询最相似的结果是不够的。通常需要过滤来缩小搜索结果。本文解释了在 Elasticsearch 和 Apache Lucene 中向量搜索的过滤是如何工作的。 Elasticsearch 拥有丰富的新功能,帮助你为自己的用例构…

Linux 性能调优之 OOM Killer 的认知与观测

写在前面 博文内容涉及到OOM Killer机制,以及利用 Cgroup/dmesg/BPF 观测 OOM Killer 事件,包括云原生环境下的 OOM Killer 机制的简单介绍 这是内存调优的最后一篇,之后会分享一些网络调优相关内容 理解不足小伙伴帮忙指正 😃,生活加油 我不再将这个世界与我所期待的,塑…

webrtc之高通滤波——HighPassFilter源码及原理分析

文章目录前言一、导读二、高通滤波过程1.HighPassFilter的创建1)HighPassFilter的作用2)开启条件3)开启配置2.高通滤波整体过程1)触发时机2)滤波器创建3)高通滤波过程三、算法实现1.原理1)滤波器…

《sklearn机器学习——聚类性能指数》同质性,完整性和 V-measure

函数:homogeneity_score 参数: labels_true: array-like, shape [n_samples] 样本的真实标签。 labels_pred: array-like, shape [n_samples] 样本的预测标签。返回值: h: float 同质性得分,在0到1之间,值越大表示聚…

HarmonyOS 应用开发新范式:深入剖析 Stage 模型与 ArkTS 状态管理

好的,请看这篇关于 HarmonyOS 应用开发中 Stage 模型与 ArkTS 状态管理的技术文章。 HarmonyOS 应用开发新范式:深入剖析 Stage 模型与 ArkTS 状态管理 引言 随着 HarmonyOS 4、5 的发布以及 API 12 的迭代,HarmonyOS 的应用开发范式已经全面…

一个Java的main方法在JVM中的执行流程

一个Java的main方法在JVM中的执行流程可以分为​​四大阶段​​:​​加载 -> 链接 -> 初始化 -> 执行​​。// HelloWorld.java public class HelloWorld {public static void main(String[] args) {String message "Hello, JVM!";System.out.p…

聚焦诊断管理(DM)的传输层设计、诊断服务器实现、事件与通信管理、生命周期与报告五大核心模块

聚焦诊断管理(DM)的传输层设计、诊断服务器实现、事件与通信管理、生命周期与报告五大核心模块,明确 UDS(ISO 14229-1)与 SOVD(ASAM 服务化诊断)的功能逻辑、交互流程及规范性要求(SWS_DM 系列)。 1 UDS 传输层(UDS Transport Layer) 作为 DM 与诊断客户端的 UDS …

关于npm的钩子函数

一、npm scripts 的生命周期钩子(Lifecycle Scripts) npm 提供了一些 ​​特殊的 script 名称​​,它们是 ​​生命周期钩子​​,会在特定时机 ​​自动执行​​。这些钩子包括: 1.prepublishOnly(在 npm publish之前执…

167.在Vue3中使用OpenLayers模仿共享单车,判断点是否放在规划的电子围栏内

一、前言大家好,这里分享一个 Vue3 OpenLayers 的小案例: 模仿共享单车的电子围栏功能,用户在地图上绘制停泊点时,系统会自动判断该点是否在规划好的电子围栏内(多边形或圆形)。这个功能在实际项目中有很大…

键盘上面有F3,四,R,F,V,按下没有反应,维修记录

打开游戏,按了好几遍F,结果都没反应,但是左右上下行走是没问题的。一脸懵逼???打开键盘测试网页,发现有一列没反应,F1不是,F1我定义了一个快捷键,跟测试冲突了…

8051单片机-成为点灯大师

第三章 成为点灯大师 1. 硬件设计 上一章说到,怎么点亮LED灯,很简单啊,就是把P2口设置成低电平就行了。接下来让我们更进一步,完成LED闪烁、流水灯实验2. 软件设计 2.1 LED闪烁实验 为了使LED闪烁,我们自然而然的想到要…

Rust 日志库完全指南:从入门到精通

GitHub 仓库: https://github.com/zhouByte-hub/rust-study ⭐ 如果这个项目对您有帮助,请给我一个 star! 在 Rust 生态系统中,日志处理是一个至关重要的环节。无论是开发小型应用还是大型系统,良好的日志记录都能帮助我们追踪问题…

【科研绘图系列】R语言绘制论文合集图

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍 数据准备与过滤 统计分析 可视化绘图 抗药性分析 系统发育分析 加载R包 数据下载 Supp figure 1 Fig 1a Fig 1c Fig 1d Fig 1e Fig 1f Supp figure 3 Supp figure 4 Supp figure 5…

【c++】从三个类的设计看软件架构的哲学思考

从三个类的设计看软件架构的哲学思考 文章目录从三个类的设计看软件架构的哲学思考前言一、OP类:系统工程的安全守护者设计特点设计哲学适用场景现实类比二、VarReviser类:版本控制的严谨管理者设计特点设计哲学适用场景现实类比三、Model类:…

人工智能优化SEO关键词的实战策略

本文聚焦智能技术如何革新关键词优化实践,系统解析提升网站排名的核心路径。重点探讨语义分析如何精准匹配用户意图、长尾词智能挖掘怎样解锁高潜力流量,并详解工具筛选高转化关键词的五大实用策略。通过实战案例说明技术如何突破流量增长瓶颈&#xff0…

【c++】c++第一课:命名空间

文章目录1.C的第⼀个程序2.命名空间2.1 namespace的价值2.2 namespace的定义2.3 命名空间使⽤最新的c标准(建议收藏) 1.C的第⼀个程序 C兼容C语⾔绝⼤多数的语法,所以C语⾔实现的helloworld依旧可以运⾏,C中需要把定义⽂件代码后…

版本发布流程手册:Release分支规范与Bug分级标准全解析

在软件交付日益高频、用户需求快速迭代的今天,版本发布流程的规范性直接决定了团队的交付效率、产品质量和用户满意度。然而,许多团队仍面临以下痛点: 发布混乱:分支管理随意,代码冲突频发;质量失控&#…

什么是CA根证书

CA 根证书(Certificate Authority Root Certificate)是 数字证书体系(PKI,Public Key Infrastructure) 中的核心证书。它有几个关键点:1. 定义 CA(Certificate Authority)&#xff1…

git push -u origin main 这个-u起什么作用

git push -u origin main 里的 -u 等价于 --set-upstream,它的作用是:👉 把本地分支 main 和远程分支 origin/main 绑定(建立追踪关系)。🔹 具体效果第一次推送分支时,如果加了 -u:本…