JVM基本结构图如下所示:
如下是针对每个部分的介绍:
负责从文件系统或者网络中加载Class信息。
加载的类信息存放于一块称为方法区的内存空间。
除了类的信息外,方法区中可能还会存放运行时常量池信息,包括:字符串字面量和数字常量(这部分常量信息是Class文件中常量池部分的内存映射)。
方法区是所有线程共享的。
Java堆是在虚拟机启动的时候建立的,它是Java程序最主要的内存工作区域。几乎所有的Java对象实例都存放于Java堆中。
堆空间是所有线程共享的。
Java的NIO库允许Java程序使用直接内存,在NIO被广泛使用后,直接内存的使用也变得非常普通。
直接内存是Java堆外的、直接向系统申请的内存区间。访问速度会优于Java堆。它大空间大小只会受操作系统给出的最大内存影响。
与Java堆相比,虽然在访问读写上直接内存有较大的优势,但是在内存空间申请时,堆空间的速度远远高于直接内存。
结论:直接内存适合内存空间申请次数较少、访问较频繁的场合。
它是线程私有的,它在线程创建的时候被创建。
Java栈中保存着栈帧信息、局部变量、方法参数、同时和Java方法的调用、返回密切相关。
它与Java栈非常类似,最大的不同在于Java栈用于Java方法的调用,而本地方法栈则用于Native方法调用。
它是每个线程私有的空间。
如果正在执行的方法不是本地方法,PC寄存器就会指向当前正在被执行的指令。
如果当前方法是本地方法,那么PC寄存器的值就是undefined。
GC可以对方法区、Java堆和直接内存进行回收。
Java堆是GC的工作重点,和C、C++不同,Java中所有的对象空间释放都是隐式的。
是Java虚拟机的最核心组件之一,它负责执行虚拟机的字节码。