JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介
Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。
1.1 JVM 的基本组成
JVM 主要由以下几个部分组成:
- 类加载器:负责将 .class 文件加载到内存中。
- 执行引擎:负责解释执行字节码或通过即时编译(JIT)将其转换为机器码。
- 运行时数据区:包括堆、栈、方法区和程序计数器等,用于存储程序运行时的数据和状态。
- 本地接口:用于融合不同的编程语言,虽然使用较少,但在需要与硬件交互时仍然重要。
1.2 JVM 的运行流程
- 编译:Java 源代码通过 javac 编译器编译成字节码(.class文件)。
- 类加载:类加载器将字节码文件加载到 JVM 的内存中。
- 执行:执行引擎解释或编译字节码,并提交操作系统执行。
- 垃圾回收:自动管理内存,防止内存泄漏和溢出。
1.3 JVM 的跨平台特性
JVM 的跨平台特性使得 Java 程序可以在任何支持 JVM 的操作系统上运行,实现了“一次编写,到处运行”(Write Once, Run Anywhere, WORA)的目标。这是通过 JVM 屏蔽底层硬件和操作系统的差异,提供统一的字节码规范来实现的。
2、JVM 的内存结构
JVM 在执行 Java 程序的时候,为了便于管理,会把它所管理的内存划分为多个不同区域。
JVM 的内存结果如下图:
2.1 字节码文件(class 文件)
字节码文件(class 文件)是 Java 程序编译后生成的中间代码,这些中间代码将会被 JVM 解析并执行。字节码文件是 Java 源代码(.java)编译后生成的中间代码文件(.class),采用二进制格式存储,包含 JVM 可执行的指令集。与机器码不同,字节码是平台无关的中间表示,需由 JVM 解释或即时编译(JIT)为机器码执行。
2.2 类加载器(ClassLoader)
类加载器子系统负责把 class 文件转载到内存中,供虚拟机执行。
2.3 方法区(Method Area)
方法区用来存储被虚拟机加载的类信息、常量、静态变量、编译器编译后的代码等数据。在类加载器加载 class 文件的时候,这些信息将会被提起出来,并存储到方法区中。由于这个区域是所有线程共享的区域,因此,它被设计为线程安全的。方法区可以被看出 JVM 的一个规范,在 HotSpor 中,方法区是用 Perm 区来实现的方法区。
2.4 堆(Heap)
堆是虚拟机启动的时候创建的被所有线程共享的区域。这块区域只要用来存储对象的实例,通过 new 操作创建出来的对象的实例都存储在堆空间中,因此,堆就成为垃圾回收器管理的重点区域。
2.5 程序计数器(Program Counter Register)
程序计数器用于记录当前线程执行字节码的指令地址(行号指示器&#x