学习尚硅谷以及深入理解Java虚拟机后,记下如下笔记,方便后续查看;
01 JVM与Java体系结构
一、Java程序的运行
1. 常见的Java项目运行的结构体系
JVM是Java程序运行的基石;
2. 计算机运行程序的流程
任何高级语言必须编译汇编成机器指令才能被计算机的CPU所执行;
3. Java VS C++ 内存分配
区别:
- Java自动垃圾回收;
- C++需要收到进行垃圾回收;
二、 Java及JVM简介
1. Java:跨平台的语言
Java编译一次可以在任何平台进行运行,例如window、linux等,不瘦平台的限制,如口号“write once, run anywhere”
2. JVM:跨语言的平台
JVM虚拟机不仅可以运行Java语言,可以运行任何符合JVM规范的语言;
解析:
- Java虚拟机平台可与运行非Java语言编写的程序;
- Java虚拟机只关心字节码文件,只要其它编程语言的编译结果满足Java虚拟机的内部指令集、符号表以及其它辅助信息即可;
- Java虚拟机与Java语言并没有必然的联系,它只与特定的二进制文件格式Class文件格式关联;
三、 虚拟机与Java虚拟机
1. 虚拟机
虚拟机是一台虚拟的计算机,是一款软件,可分为两大类
- 系统虚拟机:例如Visual Box、VMware属于系统虚拟机,完全对物理计算机的仿真;
- 程序虚拟机:Java虚拟机,专门为执行单个计算机程序而设计;
虚拟机上运行的程序均受限于虚拟机提供的资源;
2. Java虚拟机
Java虚拟机是一台执行Java字节码(可以由多种语言编译来,并非限制一定是Java语言)的虚拟计算机;
作用:
- Java虚拟机是二进制字节码的运行环境,负责加载字节码到其内部,并翻译成机器指令执行;
特点:
- 一次编译,到处运行
- 自动内存管理
- 自动垃圾回收
3. JVM在计算机中的位置
四、 JVM的整体结构
五、 Java代码执行流程
六、JVM的架构模型
Java编译器输入的指令流基本上是一种基于栈的指令集架构;
1. 基于栈式架构的特点
- 设计和实现更简单,适用于资源受限的系统;
- 避开了寄存器的分配难题:使用零地址指令方式分配;
- 指令流中的指令大部分是零地址指令,其执行过程依赖于操作栈。指令集更小,编译器容易实现;
- 不需要硬件支持,可移植性好,更好实现跨平台;
2. 基于寄存器架构的特点
- 指令集架构完全依赖硬件,可移植性差;
- 性能优秀和执行效率高;
- 花费更少的指令完成一项操作;
- 在大部分情况下,基于寄存器的指令集架构往往都以一地址指令、二地址指令和三地址指令为主,而基于栈式架构的指令集以零地址指令为主;
- 典型的应用是x86的二进制指令集:比如传统的PC以及Android的Davlik虚拟机;
3. JVM架构总结
【例子:执行2+3两种指令集】
基于栈式架构
iconst_2
istore_1
iconst_3
istore_2
iload_1
iload_2
iadd
istore_0
基于寄存器架构
mov eax,2 //将eax寄存器的值设为1
add eax,3 //将eax寄存器的值加3
- 处于跨平台性设计,JVM选择基于栈式的的指令集;
- 优点:跨平台性好、指令集小;
- 缺点:执行性能下降;
七、 JVM的生命周期
1. 虚拟机的启动
Java虚拟机的启动是通过引导类加载器(bootstrap class loader)创建一个初始类(initial class)来完成,这个类是由虚拟机的具体实现指定的;
2. 虚拟机的执行
- 一个运行的虚拟机有着一个清晰的任务:执行Java程序;
- 程序开始执行时虚拟机开始执行,程序结构即停止;
- 执行一个所有的Java程序的时候,真真正正正在执行的是一个叫做Java虚拟机的进程;
3. 虚拟机的退出
如下情况虚拟机会退出:
- 程序正常执行结束;
- 程序在执行过程中遇到了异常或错误而终止运行;
- 由于操作系统出现错误导致Java虚拟机进程停止;
- 某线程调用Runtime类或System的exit方法,或Runtime类的halt方法,并且Java安全管理器也允许这次exit或halt操作;
- JNI(Java Naive Interface)规范描述了用JNI Invocation API来加载或卸载Java虚拟机时,Java虚拟机的退出情况;