JVM的垃圾回收机制

news/2025/3/29 16:52:38/文章来源:https://www.cnblogs.com/cabbagehp/p/18793651

JVM 的垃圾回收机制是 Java 实现自动内存管理的核心,它的主要作用是自动识别并回收不再被使用的对象所占用的内存,以此避免内存泄漏和内存碎片问题,确保程序能高效稳定地运行。

确定垃圾对象

要进行垃圾回收,首先得明确哪些对象是垃圾对象。JVM 采用了两种常见的算法来判定:

  1. 引用计数算法::给对象添加一个引用计数器,每当有一个地方引用它时,计数器值加 1;当引用失效时,计数器值减 1。当计数器为 0 时,就认为该对象是垃圾对象。不过这个算法存在循环引用的问题,即两个对象相互引用,它们的计数器都不为 0,但实际上它们都不再被其他对象引用,这样就无法被回收。
  2. 可达性分析算法:从一系列被称为 “GC Roots” 的对象开始向下搜索,搜索所走过的路径称为引用链。当一个对象到 GC Roots 没有任何引用链相连时,则证明此对象是不可用的,会被判定为垃圾对象。常见的 GC Roots 包括虚拟机栈中引用的对象、方法区中类静态属性引用的对象、方法区中常量引用的对象以及本地方法栈中 JNI(即一般说的 Native 方法)引用的对象。

垃圾回收算法

确定了垃圾对象后,JVM 会采用不同的垃圾回收算法来回收这些对象:

  1. 标记 - 清除算法:先标记出所有需要回收的对象,之后统一回收被标记的对象。这种算法实现简单,但缺点是会产生大量内存碎片,可能导致后续无法为大对象分配连续的内存空间。
  2. 复制算法:将内存划分为大小相等的两块,每次只使用其中一块。当这块内存用完后,把存活的对象复制到另一块内存上,然后将已使用过的内存空间一次性清理掉。该算法不会产生内存碎片,但内存利用率较低,因为总有一半的内存处于闲置状态。
  3. 标记 - 整理算法:先标记出需要回收的对象,接着将存活的对象向内存的一端移动,最后清理掉边界以外的内存。它解决了标记 - 清除算法的内存碎片问题,不过移动对象会带来一定的性能开销。
  4. 分代收集算法:结合了上述几种算法的优点,根据对象的存活周期将内存划分为不同的区域。一般分为新生代和老年代。新生代中的对象存活时间短,采用复制算法;老年代中的对象存活时间长,采用标记 - 清除或标记 - 整理算法。

垃圾回收器

不同的垃圾回收器实现了上述的垃圾回收算法,JVM 提供了多种垃圾回收器,以满足不同场景的需求:

  1. Serial 回收器::是一个单线程的回收器,在进行垃圾回收时会暂停所有的用户线程,适用于单 CPU 环境下的小型应用。
  2. Parallel 回收器:是 Serial 回收器的多线程版本,多个线程同时进行垃圾回收,提高了回收效率,适合对吞吐量要求较高的应用。
  3. CMS 回收器:取最短回收停顿时间为目标,采用标记 - 清除算法,在垃圾回收过程中尽可能减少对用户线程的影响,但会产生内存碎片,并且对 CPU 资源比较敏感。
  4. G1 回收器:将整个堆划分为多个大小相等的 Region,采用标记 - 整理算法,可预测垃圾回收停顿时间,能同时兼顾吞吐量和低延迟,适用于大内存、多 CPU 的服务器环境。

垃圾回收的触发时机

JVM 的垃圾回收分为新生代垃圾回收(Minor GC)和老年代垃圾回收(Major GC/Full GC)

  1. Minor GC:当新生代的 Eden 区满时,会触发 Minor GC,对新生代进行垃圾回收。由于新生代中大部分对象的存活时间较短,所以 Minor GC 的频率较高,但回收速度也较快。
  2. Major GC/Full GC:当老年代空间不足时,会触发 Major GC 或 Full GC,对老年代和整个堆进行垃圾回收。触发的原因可能是新生代晋升到老年代的对象大小超过了老年代的剩余空间,或者永久代(在 JDK 8 之前)空间不足等。Full GC 的速度通常比 Minor GC 慢很多,因为它涉及的内存区域更大,并且可能会进行更多的对象移动和整理操作。

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

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

相关文章

ASE2N50-ASEMI工业电源专用ASE2N50

ASE2N50-ASEMI工业电源专用ASE2N50编辑:ll ASE2N50-ASEMI工业电源专用ASE2N50 型号:ASE2N50 品牌:ASEMI 封装:TO-220F 批号:最新 最大漏源电流:2A 漏源击穿电压:500V RDS(ON)Max:5.0Ω 引脚数量:3 沟道类型:N沟道MOS管、中低压MOS管 漏电流:ua 特性:N沟道MOS管、…

Hack The Box-Cap靶机

该靶机通过信息收集拿到大致信息,利用IDOR访问控制缺陷漏洞获得目标流量包,通过流量分析获取到ftp流量包存在用户名密码,可以ftp登录/ssh登录拿到第一个flag,利用linpeas.sh内网收集工具得到python存在UID提权漏洞,查看ctfobins提权,在/root下发现第二个flag靶机信息一、…

安装使用抓包神器:Whistle

来到查看抓包请求的页面,可见显示十分的全面还能显示树状图,根据域名进行区分,功能十分强大!安装步骤1.安装Node 因为Whistle是基于Node实现的跨平台web调试代理工具,所以我们需要先去安装Node环境 Node.js (nodejs.org) 直接下载即可2.安装Whistle Node安装成功后,执行如…

PCIe 四种地址空间介绍

PCIe架构定义了4种地址空间:配置空间、Memory空间、IO空间和message空间。1. 配置空间 每个PCIe Function都有4KB的配置空间(Configuration Space)。前256 Bytes是和PCI兼容的配置空间,剩余的是PCIe扩展配置空间(Extended Configuration Space)。 PCIe配置空间如下图所示,地…

DeepSeek 0324版本 前端代码编写能力实测

deepseek发布了一个小版本的更新。这次web端的代码编写能力增强了。来看下我用最新的deepseekv3-0324版本生成的两个前端html程序。 第一个是公司年会自动抽奖程序。 第二个是7天 天气预报的卡片。 先看第一个程序的提示词: “帮我生成一个自动抽奖的html程序,输入人员名单后…

SpringSecurity5(12-Csrf防护)

Spring Security的CSRF防护机制通过生成唯一的令牌来防止跨站请求伪造攻击。每次用户提交表单时,系统会自动验证该令牌是否与服务器端一致,若不匹配则拒绝请求。该功能默认启用,有助于保障应用的安全性,避免恶意请求劫持用户会话。工作原理 从 Spring Security 4.x 开始,默…

相机模型

本文从经典的针孔相机模型开始,推导出相机的几何模型。这个模型描述了如何把三维场景中的坐标转换到二维图像上。只有理解了这个模型,我们才有可能从二维的图像反向推测三维世界,也就能够实现三维重建的过程。 参考资料: 计算机视觉 鲁鹏 清晰完整合集 小孔成像原理 针孔模…

zerotier搭建虚拟局域网,自建planet

基于该开源项目 自建planet节点,更快速,更安全本教程依据docker-zerotier-planet 项目文档书写,并以linux(centos 7)和windows作为示例。 一. 前置资源1、具有外网ip的服务器 后面简称 服务端 2、服务端已安装docker,git 3、系统为常见linux系统 4、多个内网设备,如个人笔…

17.1K star!两小时就能训练出专属于自己的个性化小模型,这个开源项目让AI触手可及!

🔥「只需一张消费级显卡,2小时完成26M参数GPT训练!」 🌟「从零构建中文大模型的最佳实践指南」 🚀「兼容OpenAI API,轻松接入各类AI应用平台」🔥「只需一张消费级显卡,2小时完成26M参数GPT训练!」🌟「从零构建中文大模型的最佳实践指南」🚀「兼容OpenAI API,…

17.1K star!两小时就能训练出专属与自己的个性化小模型,这个开源项目让AI触手可及!

🔥「只需一张消费级显卡,2小时完成26M参数GPT训练!」 🌟「从零构建中文大模型的最佳实践指南」 🚀「兼容OpenAI API,轻松接入各类AI应用平台」🔥「只需一张消费级显卡,2小时完成26M参数GPT训练!」🌟「从零构建中文大模型的最佳实践指南」🚀「兼容OpenAI API,…

Android 外部启动activity,自定义action,action常量大全

从任意app,启动另外一个app的activity: 1. Intent i = new Intent(); ComponentName cn = new ComponentName("com.book.android2", "com.book.android2.AndroidSearch"); i.setComponent(cn); i.setAction("android.intent.action.MAIN");…