JVM 全称 Java Virtual Machine
特性:
跨平台:class文件可以在不同操作系统上执行都是一样的,所以不同平台的就有不同版本的JDK版本。
跨语言:JVM和语言是解耦的,只要语言(Groovy 、Kotlin、Jruby)能编译成字节码,就可以在JVM上运行。
JVM、JRE、JDK关系
JVM :只是一个翻译,将字节码翻译成操作系统能识别的代码。
JRE :除了包含JVM外,还提供了很多的类库(就是jar包,文件操作、网络请求等),这些就注册了Java运行环境(Java Runtime Environment)。
JDK :对程序员来说,还学要需要编译(javac)、调试(java)、打包(jar)、反编译(javap)等操作,这些都是JDK提供。
JVM整体
一个java程序,先经过javac编程成.class文件,然后jvm将它加载到方法区执行引擎执行这些字节码。
image.png
运行时数据区
主要包括,方法区、堆、虚拟机栈、本地方法栈、程序计数器
运行时数据区
1.程序计数器
线程中用来记录程序的字节码的地址。例如:分支,循环,跳转,异常,线程恢复都依赖计数器。
线程之间会根据时间片轮询争夺cpu。线程的时间片用完,记录该位置,下次又获取cpu资源,重记录的位置继续执行。
JVM中唯一不会OOM的内存区域。
2.虚拟机栈
栈是先进后出(FILO)的数据结构
栈帧包含四个区域:
局部变量表:主要存放八大基础数据类型,如果是对象则存放引用地址。(一般是32位,如果是64位就是用高低位占用两个)
操作数栈:jvm运算时入栈出栈操作
动态链接:java语言具有多态特性,需要类运行时才知道具体的方法
出口完成(返回地址):正常返回 :调用程序计数器中的地址作为返回;异常返回:异常处理器表来确定。
java虚拟机栈是基于线程的,在线程的生命周期中,参与计算的数据会频繁的入栈和出栈,栈的生命周期和线程一样。
javap.png
java里面每一个方法被调用时都会创建一个栈帧,并入栈。调用完成就出栈。当所有栈帧出栈后,线程就结束了。
在jvm中,基于解释执行的这种方式是基于栈(操作数栈)的引擎。
3.本地方法栈
与虚拟机栈相似的一个区域,服务对象是native方法。Hotspot直接将本地方法栈和虚拟机栈合二为一。
4.方法区
方法区是JVM规范中的一部分,Oracle 的 JRockit、IBM 的 J9 就不存在永久代,HotSpot虚拟机中,开发人员用永久代实现了JVM规范的方法区。java8以后用元空间进行代替,元空间存储位置是本地。
主要存放虚拟机加载类相关信息,包括类信息、静态变量、常量、运行时常量池、字符串常量池。
5.堆
申请的几乎所有对象都在堆上。
为什么是几乎呢?对基本数据类型来说,在方法体内声明的对象,会直接栈上分配,其他情况分配在堆上。
普通对象JVM会首先在堆上创建对象,然后在其他地方使用它的引用。
堆在程序启动时就申请了,不一定全部使用。当堆达到一定阈值时,就会对堆进行垃圾回收,也叫gc(Garbage Collection)
网友评论