MPC8309 FCM硬件ECC与可编程指令序列驱动NAND Flash实战
2026/6/14 17:37:17
| 组件 | 作用 | 说明 |
|---|---|---|
| 类加载子系统 | 读取、解析字节码文件并加载到内存 | 核心是类加载器 |
| 运行时数据区 | 管理JVM使用到的内存 | 包括堆、栈、方法区等 |
| 执行引擎 | 执行字节码指令 | 包含解释器、JIT编译器、垃圾回收器 |
| 本地接口 | 调用本地方法 | 保存已编译好的本地方法,通常用C/C++实现 |
类的生命周期包含五个主要阶段:
加载阶段:
连接阶段:
初始化阶段:
clinit方法使用阶段:
卸载阶段:类被回收,需同时满足三个条件:
| 类加载器 | 实现语言 | 加载路径 | 说明 |
|---|---|---|---|
| 启动类加载器(Bootstrap) | C++ | jre/lib/ | 加载核心类,如rt.jar |
| 扩展类加载器(Extension) | Java | jre/lib/ext/ | 加载扩展类 |
| 应用程序类加载器(Application) | Java | classpath | 加载应用类 |
| 自定义类加载器 | Java | 自定义 | 继承ClassLoader |
loadClass方法Tomcat 9实现了自定义类加载器体系,打破双亲委派机制:
Bootstrap ↑ Platform ↑ Common ↗ | ↖ Catalina Shared WebApp1 WebApp2 ↗ ↖ JasperLoader JasperLoader| 引用类型 | 内存回收规则 | 典型应用场景 |
|---|---|---|
| 强引用(Strong) | 只要有GC Root可达就不回收 | 普通对象引用 |
| 软引用(Soft) | 内存不足时回收 | 缓存框架 |
| 弱引用(Weak) | 每次GC都回收 | ThreadLocal、WeakHashMap |
| 虚引用(Phantom) | 无法通过引用获取对象 | 跟踪对象回收状态,清理资源 |
| 终结器引用(Finalizer) | 对象回收前执行finalize方法 | 资源清理(不推荐使用) |
年轻代 老年代 Serial Serial Old ParNew CMS Parallel Scavenge Parallel Old G1 (独立) ZGC (独立) Shenandoah (独立)| 回收器 | 算法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|---|
| Serial+SerialOld | 复制+标记整理 | 单CPU、客户端应用 | 简单高效 | 多CPU下性能差 |
| ParNew+CMS | 复制+标记清除 | 响应时间敏感应用 | 停顿时间短 | CPU资源敏感、浮动垃圾 |
| PS+PO | 复制+标记整理 | 后台计算、吞吐量优先 | 吞吐量高,自动调整 | 停顿时间不可控 |
| G1 | 分区+混合回收 | 大内存、低延迟需求 | 可预测停顿、避免碎片 | CPU消耗大 |
| ZGC | 着色指针+读屏障 | 超大堆、极低延迟 | <1ms停顿,TB级堆 | JDK11+支持 |
| Shenandoah | Brooks指针+屏障 | 低延迟应用 | 停顿与堆大小无关 | JDK12+支持 |
JVM内存 ┌──────────────┴──────────────┐ 线程共享区 线程私有区 ┌──────┴───────┐ ┌──────┼──────┐ 堆 方法区 栈 本地方法栈 程序计数器ByteBuffer.allocateDirect(size)| 区域 | 溢出原因 | 异常类型 | 解决方案 |
|---|---|---|---|
| 堆 | 对象创建过多,无法分配内存 | OutOfMemoryError: Java heap space | 扩大堆内存、优化代码、检查内存泄漏 |
| 栈 | 递归过深或线程过多 | StackOverflowError/OutOfMemoryError | 增加栈大小、优化递归算法 |
| 方法区 | 加载类过多,静态变量过多 | OutOfMemoryError: Metaspace/PermGen | 增加元空间、减少动态类生成 |
| 直接内存 | 申请直接内存超过限制 | OutOfMemoryError | 调整MaxDirectMemorySize参数 |
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/pathjmap -dump:live,format=b,file=heap.hprof <pid>| 工具 | 用途 | 常用命令 |
|---|---|---|
| jps | 查看Java进程 | jps -v |
| jstat | 监控GC状态 | jstat -gcutil <pid> 1000 |
| jmap | 生成堆转储 | jmap -heap <pid> |
| jstack | 生成线程快照 | jstack <pid> |
| jinfo | 查看JVM配置 | jinfo <pid> |
| VisualVM | 图形化监控 | 连接进程,监控GC、线程、内存 |
| Arthas | 阿里开源诊断工具 | heapdump,thread,watch |
| MAT | 内存分析 | 分析hprof文件 |
| 参数 | 说明 | 推荐值 |
|---|---|---|
-Xmx<size> | 最大堆内存 | 服务器总内存的1/2-2/3 |
-Xms<size> | 初始堆内存 | 与Xmx相同,避免扩容开销 |
-Xmn<size> | 年轻代大小 | 通常为堆的1/3,G1不建议设置 |
-XX:MaxMetaspaceSize | 最大元空间 | 256m-512m |
-Xss<size> | 栈大小 | 256k-1m |
-XX:MaxDirectMemorySize | 直接内存上限 | 根据NIO需求设置 |
# JDK8及之前-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/path/to/gc.log# JDK9+-Xlog:gc*:file=/path/to/gc.log# 其他诊断参数-XX:+DisableExplicitGC# 禁用System.gc()-XX:+HeapDumpOnOutOfMemoryError# OOM时自动dump-XX:HeapDumpPath=/path/to/dump.hprof# 选择垃圾回收器-XX:+UseSerialGC# 串行GC-XX:+UseParallelGC# 并行GC(PS)-XX:+UseConcMarkSweepGC# CMS回收器-XX:+UseG1GC# G1回收器-XX:+UseZGC# ZGC(超低延迟)字节码文件(.class)包含以下主要部分:
基础信息:
常量池:存储字符串常量、类名、方法名等
字段表:类/接口声明的字段信息
方法表:
属性表:源文件名、内部类列表等
现代JVM采用5层分层编译策略:
| 层级 | 组件 | 描述 | 优化内容 |
|---|---|---|---|
| 0 | 解释器 | 解释执行 | 记录方法/循环次数 |
| 1 | C1编译器 | 基础优化 | 生成优化机器码 |
| 2 | C1编译器 | 带收集信息优化 | 生成优化机器码+记录次数 |
| 3 | C1编译器 | 完整优化 | 生成优化机器码+类型信息 |
| 4 | C2编译器 | 深度优化 | 全局优化,生成高效机器码 |
方法内联:
逃逸分析:
避免内存泄漏:
对象设计:
集合优化:
-server -Xms4g -Xmx4g -XX:MaxMetaspaceSize=512m -XX:+UseG1GC -XX:+DisableExplicitGC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/logs/heapdump.hprof -Xloggc:/data/logs/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps必须监控指标:
告警阈值设置:
JVM作为Java程序运行的核心基础设施,其知识体系涵盖类加载机制、内存管理、垃圾回收、性能优化等多个方面。掌握JVM原理不仅有助于解决生产环境中的性能问题和内存泄漏,还能指导我们编写更高效的Java代码。
在实际工作中,应遵循以下原则: