JVM——01JVM简介

一、JVM的定位
在这里插入图片描述
 从Java语言的架构图上可以看到JVM是Java语言的基石,所有的Java程序都是运行在JVM中的,Java程序是通过JVM的编译和解释执行与操作系统乃至计算机硬件进行交互的。
在这里插入图片描述
二、虚拟机和Java虚拟机
 所谓虚拟机(Virtual Machine),就是一台虚拟的计算机。它是一款软件,用来执行一系列虚拟计算机指令。大体上,虚拟机可以分为系统虚拟机和程序虚拟机。
 大名鼎鼎的VirtualBox和VMware就属于系统虚拟机,它们完全是对物理计算机的仿真(以软件的形式对硬件的仿真),提供一个可运行完整操作系统的软件平台。
 程序虚拟机的典型代表就是Java虚拟机,它专门为执行某类计算机程序而设计,在Java虚拟机中执行的指令称为Java字节码指令。
 无论是系统虚拟机还是程序虚拟机,在上面运行的软件都被限制于虚拟机提供的资源中。
 Java虚拟机就是二进制字节码的运行环境,负责装载字节码到其内部,解释/编译为对应平台上的机器指令并执行。每一条Java指令,Java虚拟机规范中都有详细定义,如怎么取操作数、怎么处理操作数、处理结果放在哪里。正是由于Java虚拟机的存在,Java语言才能够做到“一次编译,到处运行”,除此之外,Java虚拟机还具备自动内存管理和自动垃圾回收的能力,将Java开发人员从内存管理中解放出来。
在这里插入图片描述
三、字节码
 我们通常说的Java字节码,指的是用Java语言编译成的字节码,其实字节码不一定必须由Java语言编译而来,也可以是其他语言编译而来。准确地说字节码是JVM的一个规范,任何能在JVM平台上执行的字节码的格式都是一样的,其他语言编译时只要符合这个规范,就可以在JVM上运行,因此JVM是可以跨语言的,所以字节码应该称为JVM字节码更为贴切。也正是由于字节码的规范,才使得Java语言具有了跨平台性,因为Java语言在不同的操作系统中编译出来的字节码格式都是相同的,才可以跨平台地解释执行。
 Java虚拟机与Java语言并没有必然的联系,它只与特定的二进制文件格式——class文件格式有关联。class文件中包含了Java虚拟机的指令集和符号表,还有一些其他辅助信息。

四、多语言混合编程
 Java虚拟机是一台执行JVM字节码的虚拟计算机,它拥有独立的运行机制,其运行的JVM字节码未必由Java语言编译而来。
在这里插入图片描述
 JVM平台的各种语言可以共享Java虚拟机带来的跨平台性、优秀的垃圾回收器,以及可靠的即时编译器。Java技术的核心就是Java虚拟机,因为所有的Java程序都运行在其内部。Java虚拟机可以看作是一个平台,其上可以运行多种语言,只要这种语言可以编译成符合Java虚拟机规范的字节码指令。

五、Java代码的执行过程
在这里插入图片描述
 通过Java编译器将源代码(.java)编译(javac,即java compile)成字节码文件(.class),然后通过类加载器将编译好的字节码文件加载到JVM的内存(方法区)中,然后再通过解释器将加载的字节码解释成机器能够识别的机器码指令,最后由机器(即操作系统)执行这些指令。
 Java能够做到“一次编译,处处运行”,是因为Java编译器的实现是一样的,也就是说相同的Java源代码(.java文件)通过不同的JVM编译出来的字节码都是相同的(这一点通过在windows中编译好的.class文件在linux环境中依然可以正常执行可以得到印证),但是JVM的解释器在不同的操作系统上的实现却不同,因为要将字节码解释成不同的操作系统能够识别的机器码(这一点通过在windows和linux上需要安装不同环境的JDK可以得到印证)。

六、JVM的架构设计
 Java编译器输入的指令流基本上是基于栈的指令集架构,另外一种指令集架构则是基于寄存器的指令集架构。
 具体来说这两种架构之间的区别:
基于栈式架构的特点
  设计和实现更简单,适用于资源受限的系统
  避开了寄存器的分配难题:使用零地址指令方式分配
  指令流中的指令大部分都是零地址指令,其执行过程依赖于操作栈。指令集更小,编译器容易实现
  不需要硬件支持,可移植性更好,更好实现跨平台
基于寄存器机构的特点
  典型的应用是x86的二进制指令集:比如传统的PC以及Android的Davlik虚拟机
  指令集架构完全依赖硬件,可移植性差
  性能优秀、执行更高效
  花费更少的指令去完成一项操作
  在大部分情况下,基于寄存器架构的指令集往往都以一地址指令、二地址指令和三地址指令为主,而基于栈式架构的指令集却是以零地址指令为主
 总结来说:JVM的指令集架构具有跨平台性、指令集小、指令多,但执行性能比寄存器差。

七、JVM的内存结构
在这里插入图片描述
 详细的内存结构图:
在这里插入图片描述
八、JVM的生命周期
 1、虚拟机的启动
  Java虚拟机的启动是通过引导类加载器(bootstrap class loader)创建一个初始类(initial class)来完成的,这个类是由虚拟机的具体实现指定的。
 2、虚拟机的执行
  一个运行中的Java虚拟机有着一个清晰的任务:执行Java程序。程序开始执行时它才运行,程序结束时它就停止。执行一个所谓的Java程序的时候,真真正正在执行的是一个Java虚拟机的进程。
 3、虚拟机的退出
  有如下的几种情况:
  ①程序正常执行结束
  ②程序在执行过程中遇到了异常或错误而异常终止
  ③由于操作系统出现错误而导致Java虚拟机进程终止
  ④某线程调用Runtime类或者System类的exit方法,或Runtime类的halt方法,并且Java安全管理器也允许这次exit或halt操作
  ⑤除此之外,JNI规范也描述了用JNI Invocation API来加载或卸载Java虚拟机,卸载时Java虚拟机也会退出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值