写在最前 JVM所有参数官方列表 https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html
资料参考 尚硅谷宋红康老师B站视频教程笔记整理 与 <<深入理解java虚拟机>>
JVM和Java体系结构
-
JVM运行于操作系统之上,没有和硬件的直接交互,一次编译到处运行
-
方法区和堆在所有线程共享内存区域
-
java栈,本地方法栈和程序计数器是线程私有的内存区域
-
方法区在JDK8中成为元空间Metaspace
-
方法区存在了虚拟机加载的类信息,常量,静态变量,即时编译器(JIT)编译后的代码
-
大致执行流程 .java文件->编译 .class字节码文件 -> 类状态子系统生成反射类存入方法区->运行时数据区->执行引擎->解释执行+编译执行JIT->操作系统
-
栈的指令集架构和寄存器架构
- 栈
- 设计实现简单 适用于资源受限的系统
- 避开了寄存器的分配难题,使用零地址指令方式分配
- 指令流中的指令大部分是零地址指令,其执行过程依赖操作栈,指令集更小,编译器容易实现
- 不需要硬件支持,可移植性好,更好实现跨平台
- 寄存器 指令少 性能高
- 典型的应用是x86二进制指令集 比如传统的PC和 Android的Davlik虚拟机
- 指令集架构则完全依赖硬件,可移植性差
- 性能优秀执行更高效
- 花费更少的指令去完成一项操作
- 在大部分情况下,基于寄存器架构的指令集往往都以一地址指令,二地址指令和三地址值指令为主,基于栈式架构的指令集则是以零地址质量为主
- 栈
-
简单的反编译命令
javap -v XXXX.class
-
由于跨平台的设计,java的指令都是根据栈来设计的。不同的平台CPU架构不同,所以不能使用基于寄存器来设计,优点是跨平台,指令集小,编译器容易实现,缺点在于性能下降,实现同样的功能需要更多的指令
JVM的生命周期
- 虚拟机的启动
- java虚拟机启动是通过引导类加载器boostrap class loader创建一个初始类initial class 来完成,该类由虚拟机具体实现
- 虚拟机的执行
- 一个运行的java虚拟机有清晰的任务执行java程序
- 程序开始执行他才运行,程序结束他就停止
- 真正执行的是java虚拟机的进程
- 虚拟机的退出
- 程序正常执行结束
- 程序在执行过程中遇到了异常或者错误 异常终止
- 由于操作系统出现错误导致java虚拟机进程终止
- 某线程调用Runtime类或者System类中的exit方法 或者Runtime#halt方法,并且java安全管理器也允许这次exit或者halt操作
- JNI(Java Native Interface)规范描述了用JNI Inovcation API来装载和卸载java虚拟机,java虚拟机退出的情况