1。类加载器:将类文件加载到内存中。类加载器只是加载,只要符合文件结构即可,能不能运行它不负责,那是ExecutionEngine的责任。2、执行引擎:也叫解释器,负责解释命令,交给操作系统执行。3.本地库接口(NativeInterface):本地接口的作用是为java集成不同的语言4.运行时数据区(RuntimeDataArea):(1)Heap。堆是java对象的存储区域。使用新字段分配的任何java对象实例和数组都分配在堆上。java堆可以使用-Xms和-Xmx进行内存控制。jdk1.7之后,运行时常量池开始从方法区移到堆中。(2)方法区:用来存放虚拟机加载的类信息、常量、静态变量、即时编译器编译的代码等数据。Java培训误区:方法区不等于永久一代。很多人把方法区称为“永久代”(PermanentGeneration)。当涉及到方法区时,还是使用永久代来实现方法区,这样可以省去专门为方法区写内存管理代码的麻烦,但是Jdk8中也去掉了“永久代”,而方法区是使用NativeMemory实现的。(3)虚拟机栈:虚拟机栈中每个方法执行时,都会创建一个栈帧,用于存放局部变量表、操作数栈、动态链接、方法出口等信息。(4)Native方法栈:类似于虚拟机所起的作用。与服务于Java方法的虚拟机栈相比,本地方法栈服务于虚拟机使用的Native方法。每个局部方法执行时,都会创建一个栈帧,用于存放局部变量表、操作数栈、动态链接、方法出口等信息。(5)程序计数器。表示Java虚拟机要执行的下一条字节码指令。组件的作用:首先Java代码会通过类加载器(ClassLoader)转换成字节码,然后运行时数据区(RuntimeDataArea)将字节码加载到内存中,字节码文件只是一个JVM的一部分。一套指令集规范不能直接交给底层操作系统执行,所以需要特定的命令解析器执行引擎(ExecutionEngine)将字节码翻译成底层系统指令,然后交给CPU执行.需要调用其他语言的本地库接口(NativeInterface)来实现整个程序的功能。
