1、在java的开发过程中,相信大多数都听说过jdk,jre和jvm的名词,这几样都有什么区别呢?
(1)JRE(Java Runtime Environment),也就是java运行平台,所有的java程序都要在JRE环境下才能运行。
(2)JDK(Java Development Kit),是开发者用来编译、调试程序用的开发包。JDK也是JAVA程序需要在JRE上运行。
(3)JVM(Java Virtual Machine),是JRE的一部分。它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。
JVM有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。
Java语言最重要的特点就是跨平台运行。使用JVM就是为了支持与操作系统无关,实现跨平台。
以上的描述,你可以简单的理解jre就是我们计算机的操作系统;jdk就是我们的开发工具,依赖操作系统;jvm是jre的一部分,也就是最核心部分的cpu;我们编写出来的java文件经过一系列的转化,最终都是由jvm去执行响应的。
2、既然jvm的由来已经搞清楚了,那如果我们面试遇到jvm是什么该怎么回答呢?
(1)jvm是一种用于计算设备的规范,它是一个虚构出来的机器,是通过在实际的计算机上仿真模拟各种功能实现的。
(2)jvm包含一套字节码指令集,一组寄存器,一个栈,一个垃圾回收堆和一个存储方法域。
(3)JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。JVM在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行。
3、jvm的内存模型
简单看了一下内存模型,简单看看每个区域究竟存储的是什么(干的是什么):
- 堆:存放对象实例,几乎所有的对象实例都在这里分配内存
- 虚拟机栈:虚拟机栈描述的是Java方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作栈、动态链接、方法出口等信息
- 本地方法栈:本地方法栈则是为虚拟机使用到的Native方法服务(Native Method就是一个Java调用非Java代码的接口。方法的实现由非Java语言实现,比如C或C++)。
- 方法区:存储已被虚拟机加载的类元数据信息(元空间,元空间存储着类的信息(包括类的名称、方法信息、字段信息..))。
- 程序计数器:当前线程所执行的字节码的行号指示器,每一个线程都有一个独立的程序计数器,线程的阻塞、恢复、挂起等一系列操作都需要程序计数器的参与,因此必须是线程私有的。