JDK,JRE,JVM三者定义:
JDK:JDK(Java Development Kit) 是整个JAVA的核心,包括了Java运行环境(Java Runtime Envirnment),一堆Java工具(javac/java/jdb等)和Java基础的类库(即Java API 包括rt.jar)。
JRE:JRE(Java Runtime Environment,Java运行环境),包含JVM标准实现及Java核心类库。
JVM:JVM(Java Virtual Machine),即java虚拟机, java运行时的环境,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。
联系:
JDK下面的的jre目录里面有两个文件夹bin和lib,在这里可以认为bin里的就是jvm,lib中则是jvm工作所需要的类库,而jvm和 lib和起来就称为jre。JVM+Lib=JRE。总体来说就是,我们利用JDK(调用JAVA API)开发了属于我们自己的JAVA程序后,通过JDK中的编译程序(javac)将我们的文本java文件编译成JAVA字节码,在JRE上运行这些JAVA字节码,JVM解析这些字节码,映射到CPU指令集或OS的系统调用。
针对JDK1.5-JDK1.9我做了一张思维导图 用来记忆一些新特性:
比较著名的JVM虚拟机为HotSpot,JRockit,在JDK1.8时,整合了这两个虚拟机,实现优势互补
JVM规范
JVM规范相对于Java规范独立,主要有:
Class文件类型
运行时数据
帧栈
虚拟机的启动
虚拟机的指令集
一些别的高级语言(Groovy,Scala等)也可以在JVM虚拟机上运行,但是使用的不是Java规范
JVM主要定义二进制class文件和JVM指令集等
JVM组成
1.class文件格式
2.数字的内部表示和存储
Byte -128to127 (-2^7 to 2^7-1)
3.returnAddress数据类型定义
-指向操作码的指针。不对应Java数据类型,不能在运行时修改,Finally实现需要
4.定义PC寄存器
5.堆
6.栈
7.方法区
VM的指令集:
类型转化:l2i
出栈入栈:aload astore
运算:iadd isub
流程控制:ifeq ifne
函数调用:invokevitural 虚拟机 invokeinterface接口 invokespecial invokestatic 静态区
此外JVM需要对Java类库提供支持:(组成JRE):
反射java.lang.reflect
ClassLoader
初始化class和interface
安全相关java.security
多线程
弱引用
参考文章:https://blog.csdn.net/ancientear/article/details/79483592