JVM是Java虚拟机的简称,它通过模拟各种计算机功能来实现跨平台运行。其主要组成部分包括堆、方法区、栈、本地方法栈和程序计数器。其中,方法区和堆是所有线程共享的区域,而栈、程序计数器和本地方法栈则归属于JVM管理。Java之所以能够实现“一次编写,到处运行”,主要是因为它屏蔽了操作系统平台的具体细节,只需生成适用于JVM的字节码即可在不同平台上运行。
JVM主要由类加载器(ClassLoader)、运行时数据区、执行引擎和垃圾回收四个部分组成。其中,运行时数据区涵盖了JVM的主要内存部分,包括方法区、Java堆、虚拟机栈、程序计数器和本地方法栈。
类加载器负责加载.class文件。这些文件开头有特定的标识符,类加载器还负责文件的加载过程,但是否可以执行则由执行引擎决定。
运行时数据区主要包括栈和堆。栈主要用于方法的执行,而堆则用于存储对象和数组。JVM调优主要是针对Java堆和方法区进行优化。
方法区是线程共享的内存区域,存储着已加载的类信息、常量、静态变量以及运行时常量池等数据。
Java堆是线程共享的内存区域,JVM启动时创建。Java堆是JVM中最大的内存区域,用于存储对象和数组。当Java堆空间不足时,程序会抛出OutOfMemoryError
异常。Java堆分为新生代、老年代和永久代。需要注意的是,从JDK 1.8开始,永久代已经被元空间取代。
JVM的内存空间包括方法区、Java堆、Java栈和本地方法栈。方法区是线程共享的区域,用于存储类信息、常量和静态变量。Java堆也是线程共享的区域,用于存储对象和数组。如果Java堆空间不足,程序会抛出OutOfMemoryError
异常。Java栈是每个线程私有的区域,其生命周期与线程相同。本地方法栈用于执行本地方法,PC寄存器用于控制程序指令的执行顺序。
JVM是一种基于栈执行的虚拟机,不同于Intel x86和ARM等基于寄存器的架构。
除基本类型外的所有Java类型(类和接口)都通过符号引用关联,而不是基于内存地址的引用。
JVM通过垃圾回收机制自动销毁不再使用的对象。
JVM通过明确地定义基本类型的字节长度来保证代码的平台无关性。
Java class文件的二进制表示采用网络字节序(大端模式),以确保跨平台兼容性。
类加载器负责加载.class文件,执行与否由执行引擎决定。JVM内置了启动类加载器和用户自定义类加载器。
本地方法栈主要用于登记和加载本地方法库。
栈是线程私有的内存区域,用于存储方法的局部变量和操作栈。栈不存在垃圾回收问题,因为线程结束后栈也随之释放。
程序计数器用于记录当前执行的指令,是一个较小的内存空间。
方法区是线程共享的区域,存储已加载类的元数据信息。
Java堆用于存储对象实例,垃圾回收机制会定期回收不再使用的对象。
本地接口允许Java程序与C/C++等其他语言进行交互,通过本地方法栈登记和加载本地方法库。