美文网首页
深入解析Android虚拟机--第2章 Java虚拟机基础

深入解析Android虚拟机--第2章 Java虚拟机基础

作者: 涵仔睡觉 | 来源:发表于2020-10-17 17:35 被阅读0次

一、虚拟机的作用

虚拟机(Virtual Mechine)是指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。

虚拟机的分类:

  • 系统虚拟机:提供一个可以运行完整操作系统的完整系统平台
  • 程序虚拟机:为运行单个计算机程序设计,支持单个进程

二、Java虚拟机概述

Java虚拟机(Java Virtual Mechine,简称JVM)是一个虚拟出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。JVM有完善的硬件架构(处理器、堆栈、寄存器等)和相应的指令系统。


image.png

引入JVM后,Java在不同平台上运行时不需要重新编译,JVM屏蔽了与具体平台相关的信息,使得Java只需生成在JVM上运行的目标代码(字节码),就可以不加修改地运行。JVM执行字节码时,会把字节码解释成具体平台上的机器指令执行。

2.1JVM的数据类型

image.png
image.png

JVM的实现会拒绝执行违法类型规定的字节码程序。从JVM支持的数据类型可以看出,Java对数据类型的内部格式进行了严格规定,使得各种JVM的实现对数据的解释相同,从而保证Java的与平台无关性和可移植性。

2.2 JVM体系结构

JVM由以下5部分组成:

  • 一组指令集
    JVM支持大约248个字节码,每个字节码执行一种基本的CPU运算。
    Java指令集相当于Java程序的汇编语言。Java指令集中的指令包含一个单字节的操作符(指定要执行的操作)以及0或多个操作数(提供操作所需的参数或数据)。
    JVM内层循环执行过程如下:
do {
    取一个操作符字节;
    根据操作符的值执行一个动作;
} while(程序未结束)
  • 一组寄存器
    JVM的寄存器用于保存机器的运行状态,都是32位,分为4种:
    • pc:Java程序计数器
    • optop:指向操作数栈顶端的指针
    • frame:指向当前执行方法的执行环境的指针
    • vars:指向当前执行方法的局部变量区的第一个变量的指针

JVM是栈式的,不定义或使用寄存器来传递或接收参数,保证指令集的简洁性和实现时的高效性。

  • 一个栈
    JVM的栈分为3个区域:
    • 局部变量区:每个Java方法使用一个固定大小的局部变量集,按照与vars寄存器的字偏移量来寻址。局部变量都是32位(长整数或双精度浮点数占两个局部变量的空间)
    • 运行环境区:该区包含的信息可以实现:
      • 动态链接:


        image.png
      • 正常的方法返回


        image.png
      • 异常和错误传播

    • 操作数栈区:机器指令只从操作数栈中取操作数,对它们进行操作,并把结果返回到栈中。
  • 一个无用单元收集堆(Garbage-collected-heap)
    Java的堆是一个运行时数据区,类的实例从中分配空间。Java具有无用单元收集能力,即不给程序员显示释放对象的能力。
  • 一个方法区域
    方法区保存方法代码(编译后的Java代码)和符号表。


    image.png

2.3 JVM的生命周期

JVM的天职时负责运行一个Java程序,在启动一个Java程序的同时会生成一个JVM实例,当该程序退出时,JVM实例也随之消亡。JVM实例通过调用某个初识类的main方法来运行一个程序,这个main方法必须时public、static、返回值为void,并且接收一个字符串数组作为参数。

JVM内部有两种线程:守护线程和非守护线程。只要还有非守护线程在运行,那么Java程序也在继续运行。当所以非守护线程都终止时,JVM实例将自动退出。

相关文章

网友评论

      本文标题:深入解析Android虚拟机--第2章 Java虚拟机基础

      本文链接:https://www.haomeiwen.com/subject/dqkfmktx.html