Jvm主要组成部分和作用
- 作用:首先通过编译器把Java代码转换成字节码,类加载器把字节码加载到内存中,将其放在数据运行区的方法去中。字节码文件只是Jvm的一套指令规范,不能直接让操作系统去执行,因此需要特定的命令解析器将字节码文件翻译成底层系统指令,再交给Cpu去执行,而这个过程中需要调用其他语言的本地接口来实现整个程序的功能。
运行时数据区域(Jvm内存)
1.方法区域:类级别的数据存在这里,通过编译器把代码转换成字节码,类加载器将其放在数据运行区人的方法中。
2. 堆:对象、示例变量、数组存储在这里。由于方法区和堆区的内存由多个线程共享,所以存储的数据时不安全的。
3. 虚拟机栈:对每个线程创建一个栈。所有的局部变量将在栈内存中创建。栈区是线程安全的。
- 栈:局部变量和相应的值。
- 操作数栈:作为运行时工作区去执行指令。
- 帧数据:方法所有的符号都保存在这里。在任何异常的情况下,Catch块的信息将会保存在帧数据里面。
4.本地方法栈:保存本地方法信息,对每一个线程创建一个单独的本地方法栈。
5.PC寄存器:每个线程都有一个单独的PC寄存器来保存当前执行指令的地址,一旦指令执行,PC寄存器会被更新至下条指令的地址。
类加载子系统
1.类加载器:根据类名将class文件装载到运行时数据区域的方法区中
执行引擎
1.即时编译器:用解释器代码转换成字节码,重复的代码使用JIT编译器编译成本机代码,本机代码将直接用于重复的方法调用。提高系统性能。
- 中间代码生成器:生成中间代码
- 代码优化器:优化上面生成的中间代码
- 目标代码生成器:负责生成机器代码或者本机代码
- 探测器:负责寻找多次被调用的方法
2.垃圾回收器:收集并且删除未应用的对象,可以调用System,gc()方法来触发垃圾回收机制。JVM的垃圾回收机制只收集由new创建出来的对象。所以如果不是new创建的对象,你可以使用finalize函数来执行清理。
本地库接口
和本地方法库交互,是其他编程语言交互的接口。
本地方法库
Jvm代码演示
package JVM;
/**
* 1、当jvm进程启动后,到类方法中找main()的入口类HelloJvm
* 2、找到HelloJvm后读取该文件中的二进制数据,并且把类的信息放到运行时的方法区内存区中
* 3、定位到HelloJvm中main方法的字节码中,并开始执行Main方法中的指令
* 4、创建HellowJvm1的实例对象,并且使用helloJvm1引用对象:
* (1)Jvm到方法区中查找HelloJvm1类的信息,此时发现没有该类的信息,由类加载器加载该HelloJvm类文件
* (2)在Jvm的方法区中加载并且找到HelloJvm1类后会在栈中为HelloJvm1的实例对象分配内存
* (3)Jvm实例化完成后会在当前线程中为栈中的引用建立实际的应用关系,此时会赋值给helloJvm1
* 5、在Jvm中方法的调用一定属于线程的行为。方法的调用本身会发生在线程的方法调用栈。
* 线程的方法调用栈,每一个方法的调用就是方法调用栈中的一个结构
*该结构包含了方法的参数、局部变量临时数据等。
* */
public class HelloJvm {
public static void main(String[] args) {
HellowJvm1 helloJvm1=new HellowJvm1("test");
helloJvm1.sayHellow();
}
}
class HellowJvm1 {
//name本身作为成员放在栈中,name指向的String对象是放在堆中
private String name;
public HellowJvm1(String test) {
this.name=test;
}
//放在方法区中
public void sayHellow(){
System.out.println("你好"+this.name);
}
}
JVM
1.Java虚拟机(Java Virtual Machine):解释运行字节码文件。字节码进行相应的规范之后又Jvm虚拟机进行运行。
2.JVM特点:
- 一次编译到处运行
- 自动内存管理
- 自动垃圾回收管理
3.位置:Jvm是运行在操作系统之上,他与硬件没有直接的交互。
Jvm整体结构如图:该图为网络示例图
Jvm的架构模型
由于跨平台性的设计:java的指令都是根据基于栈进行设计的,栈:跨平台性,指令集小,指令多;执行性能比寄存器差。
基于栈式架构
- 适用于资源受限的系统:打印机
- 避开寄存器的分配难题
- 指令流中的指令大部分是零地址指令,执行过程依赖于操作栈。指令集更小(指令多8位),更容易实现
- 不需要硬件的支持实现跨平台:不同的平台装JVM。
基于寄存器指令架构
- 典型的X86二进制指令集
- 依赖硬件,可移植性查
- 性能优秀执行高效
- 花费更少的指令去完成意向操作。指令少(16位)
Jvm的声明周期
启动
Java虚拟机的启动通过引导类(bootstrap class loader)创建一个初始类(init class)来完成的,这个类是由虚拟机的具体实现指定的。
执行
执行一个所谓的java程序的时候,其实执行的是java虚拟机的一个进程。
退出
当程序正常执行结束,遇到异常或错误而终止。由于操作系统出现错误导致虚拟机进程终止。某线程调运Runtime或者System的exit方法。或者Runtime的halt方法。