Java虚拟机(JVM)是Java平台的核心组件,它负责将Java字节码转换为机器码
1. 类加载子系统(Class Loading Subsystem):
• 负责将Java类加载到JVM中。这包括从文件系统、网络或其他来源读取.class文件,并将其转换为JVM可以识别的数据结构(如方法区中的类元数据)。
2. 方法区(Method Area):
• 也称为永久代(PermGen space,在Java 8之前)或元空间(Metaspace,在Java 8及之后)。它存储每个类的结构信息,如运行时常量池、字段和方法数据、构造函数和普通方法的字节码内容,以及类的层次结构信息。
3. 运行时常量池(Runtime Constant Pool):
• 是方法区的一部分,用于存储编译期生成的各种字面量和符号引用。这些字面量包括字符串字面量、数值字面量、布尔字面量和null字面量等。
4. 堆(Heap):
• JVM的内存管理区域之一,用于存放对象实例和数组。堆是垃圾回收器管理的主要区域,分为年轻代(Young Generation)和老年代(Old Generation/Tenured Generation),有时还包括永久代(在Java 8之前)或元空间(在Java 8及之后,用于存储类的元数据)。
5. 年轻代(Young Generation):
• 包括一个或多个Eden区(Eden Space)和两个Survivor区(Survivor Space,通常称为S0和S1或From和To)。新创建的对象首先被分配到Eden区,当Eden区满时,会触发一次年轻代垃圾回收(Minor GC)。
6. 老年代(Old Generation/Tenured Generation):
• 用于存放经过多次年轻代垃圾回收后仍然存活的对象。随着对象在年轻代中存活时间的增加,它们会被逐渐晋升到老年代。
7. 栈(Stack):
• JVM为每个线程分配一个私有的栈,用于存储线程执行时的局部变量表、操作数栈、动态链接、方法出口等信息。栈是线程私有的,不存在垃圾回收问题。
8. 本地方法栈(Native Method Stack):
• 与Java栈类似,但用于支持native方法的执行。它是为JVM使用到的Native方法服务。
9. 程序计数器(Program Counter Register):
• 也称为PC寄存器,它是线程私有的,用于存储当前线程正在执行的Java字节码的行号指示器。字节码解释器通过改变PC寄存器的值来选取下一条需要执行的字节码指令。
10. 执行引擎(Execution Engine):
• JVM的执行引擎负责执行字节码指令。它可能是一个即时编译器(JIT Compiler),用于将字节码转换为机器码以提高执行效率;也可能是一个解释器,用于逐条解释执行字节码指令。
11. 垃圾回收器(Garbage Collector, GC):
• 负责自动回收JVM中不再使用的对象所占用的内存空间。垃圾回收器有多种实现算法和策略,如标记-清除(Mark-Sweep)、标记-整理(Mark-Compact)、复制(Copying)和分代收集(Generational Collection)等。
12. 本地接口(Java Native Interface, JNI):
• 允许Java代码与用其他编程语言(如C、C++)编写的应用程序或库进行交互。JNI是Java与其他语言通信的桥梁。
13. 安全管理器(Security Manager):
• 提供安全管理机制,用于执行权限控制、安全策略检查等操作。安全管理器是可选的,但它在某些安全敏感的应用中非常重