当前位置: 首页 > news >正文

深入理解 Java 类加载与垃圾回收机制:从原理到实践

引言

Java 虚拟机(JVM)是整个 Java 技术体系的基石,其中“类加载机制”和“垃圾回收机制”是最核心的两大模块。理解它们,不仅能让我们在日常开发中少踩坑,更能在性能调优时游刃有余。


 一、类初始化与类加载机制

1.1 创建对象的过程

在 Java 中通过 new 关键字创建对象,实际上经历了 五个步骤

  1. 类加载检查
    当执行 new 时,JVM 会先检查该类是否已被加载、连接与初始化。若未加载,会触发类加载过程。

  2. 分配内存空间
    JVM 会在堆中为对象分配一段连续空间,空间大小由类定义的字段决定。

  3. 初始化零值操作
    对象内存分配完成后,成员变量会被设置为默认零值(如 int=0boolean=false、引用=null)。

  4. 设置对象头信息
    JVM 会在对象头中存储类的元数据、哈希码、GC年龄、锁状态等。

  5. 执行构造方法 <init>
    执行构造器逻辑,完成开发者定义的初始化。


1.2 对象的生命周期

对象的生命周期通常包括三个阶段:

阶段描述
创建(Creation)执行 new,完成初始化
使用(In Use)程序对对象的访问与操作
销毁(Destroy)对象无引用后被 GC 回收

1.3 类加载器(ClassLoader)

JVM 提供了分层的类加载器体系,用于实现类的隔离与模块化加载。

类加载器加载范围说明
Bootstrap ClassLoaderjava.* 核心类库JVM 内部实现(C++)
Extension ClassLoaderjre/lib/ext 目录下的类加载扩展类库
Application ClassLoader用户类路径(classpath)加载项目中的类
自定义 ClassLoader由开发者继承实现用于热加载、插件化等场景

1.4 双亲委派模型(Parent Delegation Model)

双亲委派是类加载体系的核心机制,其原则是:

“向上委派,向下加载”

即:当一个类加载器收到加载请求时,会优先交由父加载器尝试加载;若父加载器无法完成,才由子加载器加载。

✅ 优点总结:
  1. 保证类的唯一性:避免同一个类被多个类加载器重复加载。

  2. 保证安全性:防止用户自定义的类覆盖核心类库(如 java.lang.String)。

  3. 分层与隔离:不同模块使用不同加载器,逻辑更清晰。

  4. 简化加载流程:减少重复加载逻辑。


1.5 类加载的完整过程

类加载从“加载”到“卸载”共分 七个阶段

阶段说明
加载(Loading)读取字节码文件并转换为 Class 对象
验证(Verification)校验格式、元数据、字节码安全性
准备(Preparation)分配静态变量内存并赋初值
解析(Resolution)符号引用 → 直接引用
初始化(Initialization)执行静态代码块、构造方法
使用(Using)类被正常使用
卸载(Unloading)类与其加载器均被 GC 回收

二、垃圾回收机制(Garbage Collection)

2.1 垃圾回收简介

在 C/C++ 中,开发者必须手动释放内存,而 Java 借助 自动垃圾回收(GC)机制,让 JVM 自动检测、标记并清除无用对象,极大降低了内存泄漏与悬垂指针风险。


2.2 GC 的触发方式

触发方式说明
内存不足堆空间耗尽时自动触发 GC
手动触发调用 System.gc()(仅建议调试时使用)
JVM 参数调优-XX:+UseG1GC 控制收集器行为
内部策略JVM 根据内存阈值与对象分配速率自动判断

2.3 判断对象是否可回收

① 引用计数法(Reference Counting)
  • 每个对象维护一个引用计数。

  • 引用数为 0 的对象被视为垃圾。

  • 缺陷:无法解决循环引用问题。

② 可达性分析法(Reachability Analysis)
  • GC Roots 出发遍历对象图。

  • 不可达的对象即为垃圾。

GC Roots 包括:

  • 栈中引用的对象;

  • 静态变量;

  • 常量池引用;

  • JNI 引用。


2.4 常见垃圾回收算法

算法原理优点缺点
标记-清除(Mark-Sweep)标记存活对象后清除未标记实现简单容易内存碎片化
标记-整理(Mark-Compact)存活对象向一端移动再清除消除碎片效率较低
复制算法(Copying)将存活对象复制到另一空间无碎片,速度快内存利用率低

2.5 常见垃圾回收器(GC Collectors)

收集器区域算法特点
Serial新生代复制单线程,适合单核
ParNew新生代复制多线程版 Serial
Parallel Scavenge新生代复制吞吐量优先
Serial Old老年代标记整理单线程
Parallel Old老年代标记整理并行
CMS老年代标记清除低延迟,可能有碎片
G1整堆标记整理(分区复制)可预测停顿时间,适合大内存场景

2.6 Minor GC、Major GC 与 Full GC

类型作用范围触发条件特点
Minor GC新生代Eden 区空间不足频繁,速度快
Major GC老年代老年代空间不足稍慢
Full GC整个堆老年代空间不足或方法区溢出停顿时间长

2.7 CMS 与 G1 的区别

对比项CMSG1
作用范围老年代整个堆
算法类型标记清除标记整理
碎片问题有碎片无碎片
STW 时间可预测
浮动垃圾存在较少
适用场景低延迟系统大内存、高并发系统

三、总结与思考

  • 类加载机制决定了类的“出生方式”;

  • 垃圾回收机制决定了对象的“离开方式”。

深入理解这两者,可以帮助我们:

  • 解决类加载冲突与热加载问题;

  • 分析内存泄漏与频繁 Full GC;

  • 在调优中合理选择 GC 策略。

http://www.dtcms.com/a/487197.html

相关文章:

  • 手机wap网站模板 带后台台州椒江做网站
  • 苏州网站推广公司东营住建局官网
  • 配置的前世今生:从逻辑中抽离,又与逻辑有限融合
  • 十三、kubernetes 1.29 之 存储 storageClass存储类、补全命令
  • Kotlin中的flow、stateflow、shareflow之间的区别和各自的功能
  • 一般网站建设的流程图wordpress账号和站内网
  • 复习总结最终版:Linux软件编程
  • 索泰显卡,索泰 firestorm 官方下载
  • 网站建设的主要内容包括网页框架结构有哪些
  • 公司做一个网站企业网站制作哪些公司制作
  • 青岛做外贸网站建设wordpress订阅关闭
  • 【个人成长笔记】在Ubuntu中的Linux系统安装实验室WIFI驱动安装(Driver for Linux RTL8188GU)
  • 腾讯音视频功能有哪些
  • 网站建设的流程与思路完美代码网站
  • 基于 GitLab CI/CD 与 Google Gemini 的 AI Code Review 自动化方案
  • 【Vue专题】前端JS基础Part1(含模版字符串、解构赋值、变量常量与对象)
  • 婚庆网站开发背景wordpress怎么改后台
  • 0.2、​​AI Agent 开发中 ReAct 和 MAS 的概念
  • 网站源码风险哈尔滨 门户网站
  • 那些企业网站做的漂亮怎么做免费公司网站
  • 【Go】--扩容机制
  • 网站上哪个做相片书好哈尔滨信息网租房信息
  • 电子商城官方网站做网站的需要什么资质证明
  • 外贸网站制作需求wordpress设置多语言
  • 怎么提Issue与PR
  • wordpress建站资源漂亮的网站设计
  • Flowise 任意文件读写漏洞 | CVE-2025-61913
  • 青岛网站建设平台纯静态网站
  • STM32基于can总线通信控制多个舵机/电机原理及代码
  • 图解AES密钥扩展与加密过程