JVM的组成部分

JVM的主要组成部分有:类加载器(Class Loader)、运行时数据区(Runtime Data Area)、执行引擎(Execution Engine)、本地数据库接口(Native interface)。
各组件的作用:首先通过类加载器将Java代码转换成字节码,运行时数据区将字节码加载到内存中,而字节码文件只是JVM的一套指令集规范,并不能直接交由底层操作系统执行,因此需要执行特定的命令解析器执行引擎,将字节码文件翻译成底层系统指令,再交给CPU去执行,这个过程中需要调用本地数据库接口来实现整个程序的功能。

JVM的运行时数据区

Java堆、方法区、虚拟机栈、本地方法栈、程序计数器
Java堆:存放大部分的对象实例,被所有线程共享,是垃圾回收的主要区域。标记-清除法,标记-复制法,标记整理法
方法区:存储虚拟机已经加载的类的信息、常量、静态变量(static)、即时编译器编译后的代码等,所有线程共享的区域。运行时常量池也是方法区的一部分。
虚拟机栈:描述的是Java方法执行的内存模型。每个方法运行的同时就会创建一个栈帧,存储局部变量表、操作数栈、动态链接、方法出口等。每个方法从调用执行到完成的过程,都对应一个栈帧从入栈到出栈的过程。他是每个线程都私有的,生命周期和线程相同。
本地方法栈:和Java虚拟机栈功能类似,但是为Native方法服务。
程序计数器:一块很小的地址,是线程私有的,指向方法区中的方法字节码,用来存储指向下一个指令的地址

JVM的内存模型

Java线程之间的通信由Java内存模型(JMM)控制,JMM决定一个线程对共享变量的写入在什么时候对另一个线程可见。从抽象角度看,Java内存模型(JMM)定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存中,每个线程都有一个私有的本地内存,本地内存中存储了该线程以读/写变量的副本。