根据《JAVA虚拟机规范》,JVM模型一般分为4大部分,如下图:
1、类加载器(ClassLoader)
在JVM启动或运行时加载需要的class文件到JVM中;下图表示从java源文件到JVM的整个过程:
2、内存区(也叫运行时数据区)
JVM运行的时候所分配的区域,内存区可以划分为以下几个部分:
a、方法区
用于存放类结构等信息的地方,主要包括常量池、静态变量、构造函数等;
b、Java栈
Java栈总是与线程关联在一起,每创建一个线程时,就会为这个线程创建一个对应的java栈,每运行一个方法就会创建一个栈帧,用于存放对应的局部变量、操作栈和方法返回值等。每一个方法从调用到完成的过程,就对应一个栈帧在Java栈中的入栈与出栈的过程;所有Java栈是线程所私有的;
c、Java堆
存储Java实例和对象的地方;这里是GC的主要运作区域;Java栈和Java堆都是被所有线程共享的;
GC的两种算法:引用计数法、可达性算法;
d、本地线程栈
和Java栈的作用差不都,只不过是为了JVM调用本地方法服务的;
e、程序计数器
用于保存当前线程执行的内存地址;由于JVM是多线程的(多个线程轮流切换),为了保证线程切换回来后,还能恢复到原先状态,就需要一个独立的计数器,来记录之前中断的地方,因此程序计数器也是线程私有的;
3、执行引擎
执行class文件中的字节码指令;
4、本地库
主要调用C或者C++实现的本地方法及返回结果;