JVM的位置和JVM的结构体系
JVM的位置
JVM是在操作系统上面进行跑,jvm被JRE包含在里面,jvm上面跑的就是java程序。
从图中可以清晰看到 JVM(Java Virtual Machine,Java 虚拟机 ) 的位置:
它处于 JRE(Java Runtime Environment,Java 运行时环境 ) 这一层,是 JRE 的核心组成部分。整体架构里,JVM 在应用程序(图中的多个 “A” )下方,借助 JRE 承接应用程序的运行需求;同时,JVM 位于操作系统(Windows、Linux、Mac 等 )之上,通过操作系统与底层硬件体系(Intel、Spac 等 )交互,起到 “中间桥梁” 作用 —— 让 Java 程序能在不同系统、硬件上,借助 JVM 实现跨平台运行 。简单说,JVM 嵌在 JRE 层,上连应用、下接操作系统,是 Java 程序运行的 “虚拟环境” 核心 。
JVM的体系结构
JVM(Java Virtual Machine,Java 虚拟机 )体系结构主要包含以下关键部分,结合图来看:
1. 类加载子系统(Class Loader)
-
作用:负责加载
.class
文件(由 Java 源码编译生成),把字节码数据装入 JVM ,并进行校验、准备等操作,将类数据放到方法区 ,让后续执行引擎能使用。
2. 运行时数据区(Runtime Data Area)
是 JVM 执行 Java 程序时管理内存的区域,细分为:
-
方法区(Method Area):存储类的元数据(如类信息、常量、静态变量等 ),供整个程序共享,不同 JVM 实现对其称呼可能有差异(如 HotSpot 里的 “永久代” 是方法区的一种实现,不过现在多用元空间 )。
-
Java 栈(Java Stack):也叫虚拟机栈,线程私有。每个方法执行时会创建栈帧,用于存储局部变量、操作数栈、方法出口等信息,方法调用和返回对应栈帧的入栈、出栈。
-
本地方法栈(Native Method Stack):和 Java 栈类似,但为本地方法(用
native
修饰、由非 Java 语言实现的方法 )服务,不同 JVM 实现对其处理有别,有的直接复用 Java 栈。 -
堆(Heap):JVM 中最大的内存区域,线程共享,几乎所有对象实例和数组都在这分配内存,是垃圾回收(GC)的主要区域,分新生代、老年代等,方便垃圾回收器高效回收内存。
-
程序计数器(Program Counter):线程私有,记录当前线程执行的字节码指令地址,线程切换后能恢复执行位置,保证程序正常流转,若线程执行的是本地方法,计数器值为 undefined 。
3. 执行引擎(Execution Engine)
负责执行字节码指令,它会把字节码翻译成机器能理解的指令并执行,和运行时数据区协作,从 Java 栈、堆等获取数据,完成计算逻辑,还会结合即时编译(JIT)等优化技术,提升执行效率。
4. 本地方法接口(Native Method Interface)与本地方法库
-
本地方法接口:作为 Java 代码调用本地方法(非 Java 实现 )的桥梁,让 JVM 能融合其他语言编写的功能。
-
本地方法库:存放本地方法的具体实现,供本地方法接口调用,实现和操作系统、硬件等底层交互 。
注意!
在本地方法栈,java栈,程序计数器里面是不会产生垃圾的,不然程序会堵死,无法使用,我们常说的调优绝大部分都是在方法区和堆这两个结构里面进行调优。