源文件经过编译,生成字节码文件
JVM执行字节码文件(实际上就是将字节码解释成具体平台上的机器指令)
jdk,jre,jvm三者的关系:
jvm的组成:
(1)类加载器子系统:负责将.class文件加载到JVM中
(2) 执行引擎:即时编译器(将字节码编译成机器码)+垃圾回收器(回收运行过程中不再使用的对象)
(3)本地接口库(Native Interface Library)。本地接口库通过调用本地方法库(Native Method Library)与操作系统交互
(4) 运行时数据区:JVM运行过程中产生的数据存储在这里
接下来分别介绍运行时数据区中的五部分:虚拟机栈,本地方法栈,程序计数器,堆区,方法区
1.虚拟机栈:栈由一个个栈帧组成,而每个栈帧中都拥有:局部变量表、操作数栈、动态链接、方法返回地址。和数据结构上的栈类似,两者都是先进后出的数据结构,只支持出栈和入栈两种操作。
2.本地方法栈:
和虚拟机栈所发挥的作用非常相似
区别是: 虚拟机栈为虚拟机执行 Java 方法 (也就是字节码)服务,而本地方法栈则为虚拟机使用到的 Native 方法服务。
在 HotSpot 虚拟机中将本地方法栈和 虚拟机栈合二为一
3.程序计数器 略
以上三个是线程私有,下面两个是线程公有:
4.堆区
在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存
堆可以细分为新生代和老年代,再细致一点有:Eden、Survivor、Old 等
5.方法区 jdk1.8后方法区变成了元空间
jdk1.7之前,运行时常量池和字符串常量池都在方法区里面,jdk1.7把字符串常量池移到堆中了