Java虚拟机简称JVM
简历:了解JVM基本的结构,了解class文件基本的结构
jvm与Java无关
总结
- Java技术体系-再看java
- 虚拟机规范再看jvm
- 运行时数据区
栈上分配
对没有逃逸出方法体的对象栈上分配
public void alloc{
User u=new User();栈
}
普通对象在堆中分配,各线程共享。但有GC消耗。
当确定对象不会发生方法逃逸时,可在线程栈上分配对象。此时对象生命周期和方法相同,随栈帧出栈时即可销毁,不需要GC了。
Java技术体系
JDK包含Java程序设计语言、各种硬件平台的Java虚拟机实现、Java类库
- Java程序设计语言
- 各种硬件平台上的Java虚拟机实现
- Java类库
- Class文件格式
- 来自商业机构和开源社区的第三方Java类库
JVM虚拟机
JVM是一种规范,虚拟的计算机。
所谓虚拟机(Virtual Machine),就是一台虚拟的计算机。它是一款软件,用来执行一系列虚拟计算机指令。大体上,虚拟机可以分为系统虚拟机和程序虚拟机。
无论是系统虚拟机还是程序虚拟机,在上面运行的软件都被限制于虚拟机提供的资源中。
-
Java虚拟机是一台执行Java字节码的虚拟计算机,它拥有独立的运行机制,其运行的Java字节码也未必由Java语言编译而成。
-
JVM平台的各种语言可以共享Java虚拟机带来的跨平台性、优秀的垃圾回器, 以及可靠的即时编译器。
-
Java技术的核心就是Java虚拟机(JVM,Java Virtual
Machine),因为所有的Java程序都运行在Java虚拟机内部。
JVM虚拟机作用
Java虚拟机就是二进制字节码的运行环境,负责装载字节码到其内部,解释/ 编译为对应平台上的机器指令执行。每一条Java指令,Java虚拟机规范中都有详细定义,如怎么取操作数,怎么处理操作数,处理结果放在哪里。
特点
- 一次编译,到处运行
- 自动内存管理
- 自动垃圾回收功能
JVM的位置
JVM是运行在操作系统之上的,它与硬件没有直接的交互。
硬件–操作系统–jvm(JVM在软件层面上)
Java虚拟机家族
目前三大商用虚拟机:HotSpot、JRockit、IBM J9
我们目前使用的是HotSpot ,JDK8自带的
虚拟机规范
- 定义了虚拟机的基本结构。
- 定义了类文件的结构。
- 定义了类的加载机制。
- 定义了虚拟机执行的字节码类型和功能。
虚拟机整体架构
虚拟机栈
执行一个方法压栈,执行完成出栈
垃圾回收机制:回收 方法区和堆
native:
一个Native Method就是一个java调用非java代码的接口,一个Native Method是这样一个java的方法:该方法的实现由非java语言实现,比如C。
前三个线程私有,线程处理完就完了
PC寄存器/程序计数器 | 不需要GC | 没有OOM | 线程私有 |
---|---|---|---|
虚拟机栈 | 不需要GC,出栈结束 | 有可能OOM | 线程私有 |
本地栈 | 不需要GC | 有可能OOM | 线程私有 |
堆 | 需要GC | 有可能 | 线程公享 |
方法区 | 需要GC | 有可能 | 线程公享 |
类文件结构
平台无关性,语言无关性。
Class文件格式采用一种类似于C语言结构体的伪结构来存储数据。
代码编译的结果从本地机器码转变为字节码, 是存储格式发展的一小步, 却是编程语言发展的一大步
类加载子系统
Java虚拟机把描述类的数据从Class文件加载到内存, 并对数据进行校验、 转换解析和初始化, 最终形成可以被虚拟机直接使用的Java类型, 这个过程被称作虚拟机的类加载。
运行时数据区
- Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。
- 这些区域有各自的用途,各自的创建和销毁的时间。有的区域随着虚拟机进程的启动而一直存在, 有的区域则是依赖用户线程的启动和结束而建立和销毁。
private static int i=0;//方法区
private int age = 20;//方法区
private String name = "sunzhang";//方法区,运行时常量池
User user1 = new User();//堆 //user1放在栈
public void test1() {
int num = 18;//局部变量栈的栈帧
执行引擎
执行引擎是Java虚拟机核心的组成部分之一。
虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。
所有的Java虚拟机的执行引擎输入、输出都是一致的:输入的是字节码二进制流,处理过程是字节码解析执行的等效过程,输出的是执行结果。