JVM学习笔记(一)——JVM结构与原理

    现在java开发岗的竞争真的是越来越激烈了,动辄都是往底层来,所以现在不得不开始JVM学习。我们首先要清楚JVM的基本结构和运行原理,才能进行更深入的学习,以下是我总结的一些JVM的基础和原理,更详细完整的学习还是需要多看书。

一、什么是JVM

    JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。这就是Java的能够“一次编译,到处运行”的原因.

 

二、原理

   JVM是java的核心和基础,在java编译器和os平台(操作系统)之间的虚拟处理器。JAVA程序不直接作用在OS平台,而是在JVM中加载、编译成字节码之后,通过JVM将每一条指令翻译成不同平台的机器码来运行。

   JVM执行程序的过程:

   1、加载.class文件;

   2、编译成字节码;

   3、管理并分配内存

   4、执行垃圾收集器。

  

 

 

 

  

这是java1.8官方定义的JVM结构图:

 

JVM学习笔记(一)——JVM结构与原理_第1张图片

   JVM是Java程序运行的容器,但是他同时也是操作系统的一个进程,因此他也有他自己的运行的生命周期,也有自己的代码和数据空间。

   我们从图中可以看到Java Virtual Machine是定义在JDK最底层的,负责与操作系统的交互,用来屏蔽操作系统环境,提供一个完整的Java运行环境,因此也叫虚拟计算机.操作系统装入JVM是通过jdk中Java.exe来完成,通过下面4步来完成JVM环境:

   1.创建JVM装载环境和配置;

   2.装载JVM.dll;

   3.初始化JVM.dll并挂接到JNIENV(JNI调用接口)实例;

   4.调用JNIEnv实例装载并处理class类。

JDK提供了两个虚拟机:

1、针对客户端应用程序的Java HotSpot Client VM(Client VM),客户端虚拟机经过调整,可减少启动时间和内存占用,可以使用-client命令启动它。

  2、针对所有平台的,JDK附带了一个Java HotSpot Server VM(Server VM)虚拟机实现。Server VM是为了最快速的实现程序执行而设计的,可以使-server命令启动它。

——这两段来自JVM官方文档

三、JVM支持的数据类型
1、基本数据类型
   byte、short、int、long、float、double、boolean、char
2、其他数据类型
    object:java数组被当做object处理
    returnAddress:用于jsr/ret/jsr-w/ret-w指令
四、JVM定义了控制Java代码解释执行和具体实现的五种规格:
    JVM虽然为开发人员省去了很多事情,但是JVM在JAVA字节码的格式中给了很明确的格式定义。这一规格包括操作码和操作数的语法和数值、标识符的数值表示方式,以及JAVA中的java对象、常量缓冲池在JVM中的存储映像。
  1. JVM指令系统
   Java指令是由操作码和操作数两部分组成,操作码为8位的二进制数,操作数紧随在操作码后面,其长度根据需要而不同。操作码用于指定一条操作指令的性质,当前度大于8位时,操作数被分为两个以上的字节存放。Java指令系统是以java语言的实现为目的设计的,其中包含调用方法和监控多线程系统的指令。Java8位操作码的长度,使得JVM最多有256种指令。

2.JVM寄存器(32位)

    所有CPU均包含用于保存系统状态和处理器所需信息的寄存器组,如果虚拟机定义较多的寄存器组,可以减少对栈和内存的访问,有利于提高速度,但是过多就会占用CPU资源。所以JVM 定义了四个寄存器:
1’pc程序计数器
2’optop操作数栈顶指针
3’frame当前操作数栈顶指针
4’vars指向当前运行环境中第一个局部变量的指针;
其中,pc用于记录程序的执行,optop、frame、vars用于记录指向java栈区的指针。

3.JVM栈结构

    Java栈是JVM存储信息的主要方法,当JVM得到一个java字节码应用程序后,便为该代码中一个类的每一个方法创建一个栈框架,以保存该方法的状态信息。每个栈框架包含以下三类信息:
1’局部变量:局部变量用于存储一个类的方法中所有的局部变量
2’执行环境:vars寄存器只想该变量表的第一个局部变量
3’操作栈:操作数栈用于存储运算所需操作数及运算的结果

4.JVM碎片回收堆

    Java类所需要的内存空间是在堆上分配的,解释器承担为类实例分配空间,分配完成之后,解释器开始监控该对象对内存区域的使用,一旦对象使用完毕,解释器将对象回收到堆中。Java解释器的回收功能用后台线程的方式来执行,不用开发人员手动执行回收。

5.JVM存储区

   JVM有两类存储区:常量缓冲池和方法区。敞亮缓冲池用于存储类名、方法和字段以及常量。方法区则用于存储java方法的字节码。JVM为Java字节码定义一套完整的规格,在具体的平台运行则由java解释器实现,使得java程序可以跨平台运行。

 

参考文章:

JVM官方文档:https://docs.oracle.com/javase/8/docs/technotes/guides/vm/index.html

https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html

https://baike.baidu.com/reference/2902369/e2a5ogtPbrCMYzMTsByrIp4H3qZWEpUMIJgIvTCNs3Rwolr3rOnZmBdEpyQLcFvv7Y9PvfWW8MWam9xPMpcVBAlFUB-_ZIGU5RdjXh4

你可能感兴趣的:(JVM,JVM)