一、JVM虚拟机是什么?
JVM是一个虚拟的计算机,具有指令集并使用不同的存储区域,负责执行指令,管理数据、内存、寄存器。本质上就是一个程序,当它在命令行上启动的时候,就开始执行保存在某字节码文件中的指令。
对于不同的平台,有不同的虚拟机。Java语言的可移植性就是基于JVM,任何平台只要装有针对于该平台的JVM,字节码文件(.class)就可以在该平台上运行。也就是“一次编译,处处运行”。
二、JDK、JRE、JVM之间的关系
1、JDK:java开发工具包,是提供给java开发人员使用的,其中包含了java相关的开发工具,如编译工具(javac.exe)、打包工具(jar.exe)等等,也包含了JRE。
2、JRE:java运行环境,包括JVM虚拟机和java程序所需的核心类库等,如果只是想运行一个开发完成的java程序,只需要安装JRE即可。
总体来说它们之间的关系即:JVM ⊂ JRE ⊂ JDK
三、JVM的运行位置
如图所示
四、JVM的基本结构
如图所示
1、方法区:用于存储运行时常量池、已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
2、堆:在虚拟机启动时创建,用于存储对象实例,也是发生GC的主要区域。堆内的分区有,新生代、老年代、永久代(java8取消了永久代)。其中新生代包含了Eden区和Survivor区,Survivor区里面又分为From区和To区。
3、虚拟机栈:是线程私有的,它的生命周期与线程相同,随线程而生,随线程而灭。每个方法被执行的时候,Java虚拟机都会同步创建一个栈帧,每一个方法被调用直至执行完毕的过程,就对应这一个栈帧在虚拟机栈中从入栈到出栈的过程。栈帧用于存储局部变量表、操作数栈、动态链接、方法返回值(地址)和一些附加信息。
4、本地方法栈:与虚拟机栈相似,它们之间的的区别不过是虚拟机栈为虚拟机执行java方法(也就是字节码)服务,而本地方法栈则为虚拟机使用的Native方法服务。
5、程序计数器:用于记录当前线程所执行到的字节码的行号,也就是当前线程执行到的内存地址。