3、JVM的基本结构 (1)程序计数器:存储每个线程下一步将执行的JVM指令。程序计数器是一个比较小的内存区域,用于指示当前线程所执行的字节码执行到了第几行,是线程隔离的 (2)JVM栈(JVM Stack):jvm栈是线程私有的,每个线程创建的同时都会创建jvm栈,jvm栈中存放的是当前线程中局部基本类型的变量(java中定义的8中基本类型:boolean、char、byte、Short、int、long、float、double)、部分的返回结果以及Stack Frame(每个方法都会开辟一个自己的栈帧),非基本类型的对象在JVM栈仅存放一个指向堆上的地址。虚拟机栈描述的是Java方法执行的内存模型,用于存储局部变量,操作数栈,动态链接,方法出口等信息,是线程隔离的。 (3)堆(heap):JVM用来存储对象实例以及数组值的区域,可以认为Java中所有通过new创建的对象的内存都在此分配,堆中的对象的内存需要等待GC进行回收。原则上讲,所有的对象都在堆区上分配内存,是线程之间共享的。 (4)方法区(MethodArea):方法区在JVM中也是一个非常重要的区域,它与堆一样,是被 线程共享 的区域。 在方法区中,存储了每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等。 (5)本地方法栈(NativeMethod Stacks):jvm采用本地方法栈来支持native方法的执行,此区域用于存储每个native方法调用的状态。 (6)运行时常量池(RuntimeConstant Pool):存放的为类中的固定的常量信息、方法和Field的引用信息等,其空间从方法区域中分配。jvm在加载类时会为每个class分配一个独立的常量池,但是运行时常量池中的字符串常量池是全局共享的。
转载请注明原文地址: https://www.6miu.com/read-81348.html