Java Virtual Machine
JVM 全称 Java Virtual Machine,也就是我们耳熟能详的 Java 虚拟机。它能识别 .class后缀的文件,并且能够解析它的指令,最终调用操作系统上的函数,完成我们想要的操作。
Java类加载器ClassLoader也是JVM中的一部分,他将.class存储到运行时数据区当中。最后生成机器码给操作系统。
运行时数据区域
Java虚拟机在执行Java程序 的过程中会把它所管理的
内 存
划分为若干个不同的数据 区域。
下面对运行时数据区域进行细讲:
一. 程序计数器:
由于存在多线程场景,
记录
当前线程正在执行的
字节码
指令的地址。
由于有在操作系统层存在时间片轮转,导致线程之间的切换,这就需要有内存来记录每个线程运行的地址。
在JVM内存区域中唯一不会OOM的区域,其他区域都会出现OOM。
二.虚拟机栈
存储当前线程运行方法所需的数据,指令、返回地址。如果虚拟机栈是子弹夹,那么它的子弹就是栈帧,里面可以包含很多个栈帧。
栈帧里面包含的内容:
1. 局部变量表:
顾名思义就是局部变量的表,用于存放我们的局部变量的。首先它是一个32位的长度,主要存放我们的Java的八大基础数据类型,一般32位就可以存放下,如果是64位的就使用高低位占用两个也可以存放下,如果是局部的一些对象,比如我们的Object对象,我们只需要存放它的一个引用地址即可。
2
.
操作数据栈
:存放我们方法执行的操作数的,它就是一个栈,先进后出的栈结构,操作数栈,就是用来操作的,操作的的元素可以是任意的java数据类型,所以我们知道一个方法刚刚开始的时候,这个方法的操作数栈就是空的,操作数栈运行方法就是JVM一直运行入栈/出栈的操作。
3. 动态连接:Java语言特性多态(需要类运行时才能确定具体的方法)。多态分为静态分派和动态分派。
4. 返回地址:正常返回(调用程序计数器中的地址作为返回)、异常的话(通过异常处理器表<非栈帧中的>来确定)
虚拟机栈有大小限制,默认Hotspot 虚拟机的大小为1M.可用参数 –Xss调整大小,例如-Xss256k