JAVA虚拟机体系结构
J
java栈由许多栈帧或者说帧组成的,一个栈帧包含一个java方法调用的状态。当线程调用一个java方法时,虚拟机压入一个新的栈帧到该线程的java栈中;当该方法返回时,这个栈帧被从java栈中弹出并抛弃。
1、方法区(当虚拟机运行java程序时,会查找在方法区中的类型信息)
1)存储已被虚拟机加载的类信息(包括这个类型的全限定名,直接超类的全限定名,是类类型还是接口类型,访问修饰符(public,abstract),任何直接超接口的全限定名的有序列表。)、
2)常量(常量池)、
----虚拟机必须为每个被转载的类型维护一个常量池。常量池就是该类型所用常量的一个有序集合,
包括直接常量(string,integer和floating point常量)和对其他类型、字段和方法的符号引用。
3)字段信息、
----字段名,字段类型,字段的修饰符(public,private ,protected,static,final,volatile,transient的某个子集)
4)方法信息、
---包括(方法名,方法的返回类型,方法参数的数量和类型,方法的修饰符(private ,public,protected,static,final,sysnchronized,native,abstract的某个子集))
如果方法不是本地的和抽象的,还需要存储 方法的字节码,操作数栈和该方法的栈帧中的局部变量区的大小,异 常表。
5)静态变量(除常量以外的所有类(静态)变量)、即时编译器编译后的代码等数据。
6) 一个到类ClassLoader的引用、
7) 一个到Class类的引用。
2、堆
一个java虚拟机只有一个堆空间,所有线程共享这个堆,每个java程序都有它自己的堆空间它们互不干扰,但同一个java程序的多个线程共享着一个堆需要考虑多线程访问堆数据的同步问题
java堆是垃圾回收的主要区域,可以分为:新生代和老年代,更细一点分为:Eden空间,From Survivor空间,To Survivor空间。存储 :对象和数组等,堆中的每个数组对象(还保存数组的长度,数组数据,以及某些指向数组的类数据的引用)
3、程序计数器
对一个java程序,每一个线程都有它自己的PC寄存器(程序计数器),在线程启动时创建,这个计数器记录的是正在执行的虚拟机字节码指令的地址。如果正在执行的是Native方法,这个计数器值则为空(undefined).
4.Java栈
每当启动一个新线程时,java虚拟机都会为它分配一个java栈,java栈以帧为单位保存线程的运行状态,虚拟机只会直接对java栈执行两种操作:以帧为单位的压栈和出栈。
每当线程调用一个java方法时,虚拟机都会在改线程的java栈找那个压入一个新帧,使用这个帧来存储参数,局部变量,中间运算结果等等。
5.本地方法栈
本地方法可以通过本地方法接口访问虚拟机的运行时数据区,可以直接使用本地处理器中的寄存器,和虚拟机拥有同样的权限或者是能力,任何本地方法接口都会调用本地方法栈,当线程调用java方法时,虚拟机会创建一个新的栈帧并压入java栈,当它调用的是本地方法时,虚拟机保持java栈不变,不再在线程的java栈压入新的栈,虚拟机只是简单地动态连接并直接调用指定的本地方法。本地方法栈占用的内存区不必时固定大小的,可以动态扩展或收缩,