Java--JVM
Java 虚拟机(JVM)介绍
Java 虚拟机(Java Virtual Machine,JVM)是 Java 程序运行的核心组件,它是 Java 平台无关性的关键。JVM 负责将 Java 字节码转换为机器码并执行,同时管理内存、垃圾回收、线程等资源。
一、JVM 的作用
-
平台无关性:
- Java 程序编译后生成字节码(
.class
文件),JVM 负责在不同平台上解释或编译字节码为机器码。 - 实现“一次编写,到处运行”(Write Once, Run Anywhere)。
- Java 程序编译后生成字节码(
-
内存管理:
- JVM 管理堆、栈、方法区等内存区域,自动分配和回收内存。
- 提供垃圾回收机制(Garbage Collection,GC),避免内存泄漏。
-
安全性:
- JVM 提供沙箱机制,限制 Java 程序的访问权限,防止恶意代码破坏系统。
-
性能优化:
- JVM 通过即时编译器(JIT)将热点代码编译为机器码,提高执行效率。
二、JVM 的架构
JVM 主要由以下部分组成:
1. 类加载器(Class Loader)
- 负责加载
.class
文件到内存。 - 分为三种类加载器:
- Bootstrap ClassLoader:加载核心类库(如
java.lang.*
)。 - Extension ClassLoader:加载扩展类库(如
javax.*
)。 - Application ClassLoader:加载用户自定义类。
- Bootstrap ClassLoader:加载核心类库(如
2. 运行时数据区(Runtime Data Areas)
- 方法区(Method Area):
- 存储类信息、常量、静态变量等。
- JDK 8 之前称为永久代(PermGen),JDK 8 及之后称为元空间(Metaspace)。
- 堆(Heap):
- 存储对象实例和数组。
- 分为新生代(Young Generation)和老年代(Old Generation)。
- 栈(Stack):
- 存储方法调用的局部变量、操作数栈、动态链接等。
- 每个线程有独立的栈。
- 程序计数器(Program Counter Register):
- 记录当前线程执行的字节码指令地址。
- 本地方法栈(Native Method Stack):
- 用于执行本地方法(Native Method)。
3. 执行引擎(Execution Engine)
- 解释器:逐行解释字节码并执行。
- 即时编译器(JIT):将热点代码编译为机器码,提高执行效率。
- 垃圾回收器(Garbage Collector):管理堆内存,回收无用对象。
4. 本地方法接口(JNI)
- 提供调用本地方法(如 C/C++ 代码)的接口。
三、JVM 的内存模型
1. 堆(Heap)
- 新生代(Young Generation):
- 分为 Eden 区和两个 Survivor 区(S0 和 S1)。
- 使用复制算法进行垃圾回收。
- 老年代(Old Generation):
- 存储长期存活的对象。
- 使用标记-清除或标记-整理算法进行垃圾回收。
2. 方法区(Method Area)
- 存储类信息、常量、静态变量等。
- JDK 8 之前称为永久代(PermGen),JDK 8 及之后称为元空间(Metaspace)。
3. 栈(Stack)
- 每个线程有独立的栈,存储方法调用的局部变量、操作数栈、动态链接等。
4. 程序计数器(Program Counter Register)
- 记录当前线程执行的字节码指令地址。
5. 本地方法栈(Native Method Stack)
- 用于执行本地方法(Native Method)。
四、垃圾回收(GC)
1. GC 的类型
- Minor GC:清理新生代。
- Major GC:清理老年代。
- Full GC:清理整个堆和方法区。
2. GC 算法
- 复制算法:用于新生代,将存活对象复制到 Survivor 区。
- 标记-清除算法:用于老年代,标记无用对象并清除。
- 标记-整理算法:用于老年代,标记无用对象并整理内存。
3. 常见的垃圾回收器
- Serial GC:单线程垃圾回收器,适用于小型应用。
- Parallel GC:多线程垃圾回收器,适用于多核服务器。
- CMS GC:并发标记清除垃圾回收器,适用于对延迟敏感的应用。
- G1 GC:适用于大内存、低延迟的应用。
- ZGC:适用于超大堆内存(TB 级别)和超低延迟(毫秒级)的场景。
五、JVM 调优
1. 调优目标
- 提高应用的吞吐量(Throughput)。
- 降低应用的延迟(Latency)。
- 减少 Full GC 的频率和时间。
2. 常用 JVM 参数
-Xms
:初始堆大小。-Xmx
:最大堆大小。-Xmn
:新生代大小。-XX:MetaspaceSize
:元空间初始大小。-XX:MaxMetaspaceSize
:元空间最大大小。-XX:+UseG1GC
:使用 G1 垃圾回收器。-XX:+PrintGCDetails
:打印 GC 详细信息。
3. 调优案例
- 高吞吐量应用:
-Xms2048m -Xmx2048m -Xmn1024m -XX:+UseParallelGC
- 低延迟应用:
-Xms2048m -Xmx2048m -Xmn512m -XX:+UseG1GC -XX:MaxGCPauseMillis=200
六、总结
JVM 是 Java 程序运行的核心组件,负责字节码的执行、内存管理、垃圾回收等任务。通过理解 JVM 的架构和内存模型,可以更好地优化 Java 应用的性能。以下是 JVM 的核心要点:
- 类加载器:加载
.class
文件。 - 运行时数据区:包括堆、栈、方法区等。
- 垃圾回收:管理堆内存,回收无用对象。
- 调优:通过调整 JVM 参数优化性能。
掌握 JVM 的原理和调优方法,可以帮助你编写高效、稳定的 Java 程序。
以上内容来自于deepseek.
播种和收获通常不在一个季节,而中间的过程叫做坚持~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
2022-02-21 Java中的泛型
2020-02-21 shell脚本自动化部署