天天看点

JVM01 - 概述

目录

1.JVM整体结构

2.Java代码执行流程

3.JVM的生命周期

3.1 虚拟机的启动

3.2 虚拟机的执行

3.3 虚拟机的退出

       JVM是Java Virtual Machine的缩写,是一种用于计算设备的规范,是一个虚构出来的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。JVM整体结构如图(图片来源于网络):

JVM01 - 概述

       类加载器:类加载子系统负责从文件系统或者网络中加载Class信息,加载的类信息存放于一块称为方法区的内存空间。除了类的信息外,方法区中可能还会存放运行时常量池信息,包括字符串字面量和数字常量(这部分常量信息是Class文件中常量池部分的内存映射)。

       方法区:是用来存放有关类、方法信息的一块逻辑上的区域

       堆:java堆在虚拟机启动的时候建立,它是java程序最主要的内存工作区域。几乎所有的java对象实例都存放在java堆中。堆空间是所有线程共享的,是一块与java应用密切相关的内存空间。

       栈:每一个java虚拟机线程都有一个私有的java栈,一个线程的java栈在线程创建的时候被创建,java栈中保存着帧信息,java栈中保存着局部变量、方法参数,同时和java方法的调用、返回密切相关。

       本地方法栈:本地方法栈和java栈非常类似,最大的不同在于java栈用于方法的调用,而本地方法栈则用于本地方法的调用,作为对java虚拟机的重要扩展,java虚拟机允许java直接调用本地方法。

       程序计数器:又称PC(Program Counter)寄存器,是每一个线程私有的空间,java虚拟机会为每一个java线程创建程序计数器。在任意时刻,一个java线程总是在执行一个方法,这个正在被执行的方法称为当前方法。如果当前方法不是本地方法,PC寄存器就会指向当前正在被执行的指令。如果当前方法是本地方法,那么PC寄存器的值就是undefined。

       执行引擎:执行引擎是java虚拟机的最核心组件之一,它负责执行虚拟机的字节码,现代虚拟机为了提高执行效率,会使用即时编译技术将方法编译成机器码后再执行。

       Java代码编译是由Java源码编译器来完成,流程图如下所示:

JVM01 - 概述

       Java字节码(class文件)的执行是由JVM执行引擎来完成,流程图如下所示:

       JVM完整结构图:

JVM01 - 概述

       Java虚拟机的启动是通过引导类加载器(bootstrap class loader)创建一个初始类(initial class)来完成的。

    (1)一个运行中的Java虚拟机有着一个清晰的任务:执行Java程序

    (2)程序开始执行时虚拟机才运行,程序结束时停止

    (3)执行Java程序的时,真真正正在执行的是一个叫做Java虚拟机的进程

      虚拟机退出有如下的几种情况:

    (1)程序正常执行结束

    (2)程序在执行过程中遇到了异常或错误而异常终止

    (3)由于操作系统用现错误而导致Java虚拟机进程终止

    (4)某线程调用Runtime类或System类的exit()方法,或Runtime类的halt()方法,并且Java安全管理器也允许这次exit()或halt()操作。

    (5)除此之外,JNI(Java Native Interface)规范描述了用JNI Invocation API来加载或卸载 Java虚拟机时,Java虚拟机的退出情况。