JVM运行机制及原理
一、JVM生命周期
JVM伴随Java程序的开始而开始,程序的结束而停止。一个Java程序会开启一个JVM进程,一台计算机上可以运行多个程序,也就可以运行多个JVM进程。
JVM将线程分为两种:守护线程和普通线程。守护线程是JVM自己使用的线程,比如垃圾回收(GC)。普通线程一般是Java程序的线程,只要JVM中有普通线程在执行,那么JVM就不会停止。
二、JVM启动流程
三、JVM体系结构
四、JVM内存模型
JVM内存模型主要由堆内存、方法区、程序计数器、虚拟机栈和本地方法栈组成。堆和方法区是所有线程共有的,而虚拟机栈,本地方法栈和程序计数器则是线程私有的。
1、堆内存
堆内存是生产环境中进行内存性能调优中的一个重要的内容,主要内容为内存回收的一些机制和算法。
2、方法区
用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译(JIT)后的代码等数据。
3、程序计数器
在JVM的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。
4、Java虚拟机栈
虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表(局部变量表需要的内存在编译期间就确定了所以在方法运行期间不会改变大小),操作数栈,动态链接,方法出口等信息。
5、本地方法栈
在程序调用或JVM调用本地方法接口(Native)时候启用。
五、Java类加载机制
类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。
类的加载过程:
1、装载
1)通过一个类的全限定名来获取其定义的二进制字节流。
2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。
3)在Java堆中生成一个代表这个类的java.lang.Class对象,作为对方法区中这些数据的访问入口。
2、链接。
验证:确保被加载的类的正确性
准备:为类的静态变量分配内存,并将其初始化为默认值
解析:把类中的符号引用转换为直接引用
3、初始化
为类的静态变量赋予正确的初始值,JVM负责对类进行初始化,主要对类变量进行初始化。
Java中对类变量进行初始值设定的两种方式:
1)声明类变量是指定初始值
2)使用静态代码块为类变量指定初始值