# Java 初识Jvm


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方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

全栈程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值