文章目录
JVM
Java虚拟机,主要用于运行字节码,实现跨平台
JVM是Java虚拟机,JVM保证了Java语言的平台无关性。其主要职责包括:
- 类加载:将 .class 文件加载到内存中;
- 字节码验证:确保字节码安全,防止恶意代码破坏系统;
- 解释执行 / 即时编译:将字节码转换为机器码执行;早期是纯解释执行,后来引入 JIT(Just-In-Time)编译,将热点代码编译成本地机器码以提高性能;
- 内存管理:自动分配对象内存,并通过垃圾回收器(GC)回收不再使用的内存;
- 线程管理:支持多线程调度。
JVM组成部分
JVM总体上由类加载子系统(ClassLoader)、运行时数据区、执行引擎、本地方法接口(JNI)这四个部分组成。
- 类加载子系统(ClassLoader):将字节码(.class文件)加载到内存并生成class对象
- 运行时数据区 :是JVM的内存部分,由方法区、JAVA堆、虚拟机栈、本地方法栈、程序计数器组成;
- 方法区(Method Area):存放类信息、常量、静态变量等(在 JDK 8 后改为元空间 Metaspace) ;
- JAVA堆(Java Heap):存放对象实例,所有线程共享,是 GC 主要管理区域;
- 虚拟机栈(VM Stack):每个线程私有,存放局部变量、操作数栈、方法出口等;
- 本地方法栈(Native Method Stack):为JVM使用到的 native 方法服务,例如,当Java程序调用本地C或C++代码时,就会使用本地方法栈;
- 程序计数器(PC Register):记录当前线程执行的字节码行号。
- 执行引擎 :
- 解释器:将字节码指令翻译为对应平台的本地机器指令,以指令为单位读取Java字节码,类似于一个CPU一条一条地执行机器指令;
- JIT编译器:将源代码直接编译成与本地平台有关的机器码,并且进行各种层次的优化;
- 垃圾回收器:主要用于Java堆的管理,系统运行期间会产生的大量对象实例,GC回收无用的对象
- 本地方法接口(JNI):与底层操作系统交互。
JAVA编译执行过程
javac 编译器将 .java 源文件编译为字节码文件(.class 文件),字节码文件并不直接运行在操作系统上,而是运行在 Java 虚拟机 JVM 中;
JVM 的类加载器将 .class 文件加载到内存中;字节码由 JVM 的执行引擎负责运行;最后JVM 在程序运行过程中自动管理堆内存。当对象不再被引用时,垃圾回收器(GC)会回收其所占用的内存,避免内存泄漏;
当把编译好的.class文件放到Windows系统上时,Windows版的JVM会运行它;放到macOS系统上时,macOS版的JVM会运行它

JRE
Java运行时环境,包含JVM、Java 标准库和其他支持文件,用于运行 Java 程序
JRE(Java运行时环境)是一个软件,如果只需要运行别人编译好的 Java 程序(比如一个 jar 包),而不需要自己开发,那么只需要安装 JRE 即可。包含以下三个部分,
- JVM:负责执行字节码
- Java 标准库(如 java.lang, java.util, java.io 等)
- 其他支持文件:如配置文件、属性文件、资源文件等
JDK
Java 程序的完整工具包,包括JRE和开发Java程序所必需的工具和环境,用于开发、编译、调试 Java 程序
JDK 是用于开发 Java 程序的完整工具包。它不仅包含 JRE(运行环境),还额外提供了开发、调试、编译、文档生成等一系列工具。是整个Java开发的核心。JDK 包含JAVA的运行环境(JVM + Java系统类库)和JAVA工具。
- JRE:内含 JVM + 核心类库
- JDK提供了一系列开发Java程序所必需的工具和环境
- 编译器:如javac命令,用于将Java源文件(.java后缀)编译成字节码文件(.class后缀);
- 打包工具:将类文件打包成 jar 包;
- 文档生成器:javadoc命令从源码注释中提取文档,生成API文档;
- 调试工具:jdb是Java的调试器,用于查找和修复程序中的错误;
- 反汇编器:javap是反汇编器,查看字节码;
- 其他工具如 jps、jstat、jconsole 等用于监控和诊断。
JVM、JRE和JDK的联系与区别
- JDK > JRE > JVM
- JVM是Java虚拟机,主要用于运行字节码,提供了内存管理、垃圾回收、安全性等功能,实现了 java 程序的跨平台性;
- JRE是Java运行时环境,包含JVM、Java 标准库和其他支持文件,用于运行 Java 程序;
- JDK是Java 程序的完整工具包,包括JRE和开发Java程序所必需的工具和环境,用于开发、编译、调试 Java 程序。
