美文网首页
JVM(一)简介

JVM(一)简介

作者: NIIIICO | 来源:发表于2022-03-24 15:08 被阅读0次

一、什么是jvm

Java Virtual Machine,是一种规范,可以将class字节码文件转换成机器码指令。任何语言(如:kotlin、groovy等),只要最终编译成class,即符合jvm规范的字节码文件,就可以在jvm虚拟机上运行。

详情可参考Java虚拟机规范

二、虚拟机

1、HotSpot
基于JVM规范的虚拟机,JDK1.31开始运用HotSpot虚拟机。
2、Dalvik&ART
应用于Android系统,它是一款不是JVM的JVM虚拟机,本质上没有遵循JVM规范。可以理解为针对Android设备定制的虚拟机。

三、基于栈的指令集&基于寄存器的指令集

我们看一个简单的示例:Test

public class Test{
    public static void main(String[] args){
        int i = 1;
        int j = 2;
        int k = i + j;
    }
}

编译成class后,使用javap -v Test.class,可以查看jvm指令。

$ javap -v Test.class
Classfile /D:/Test.class
  Last modified 2022-3-28; size 273 bytes
  MD5 checksum 219323956d5900c9cfdfc06a2a92fe41
  Compiled from "Test.java"
public class Test
  minor version: 0
  major version: 52
  flags: ACC_PUBLIC, ACC_SUPER

// 常量池
Constant pool:
   #1 = Methodref          #3.#12         // java/lang/Object."<init>":()V
   #2 = Class              #13            // Test
   #3 = Class              #14            // java/lang/Object
   #4 = Utf8               <init>
   #5 = Utf8               ()V
   #6 = Utf8               Code
   #7 = Utf8               LineNumberTable
   #8 = Utf8               main
   #9 = Utf8               ([Ljava/lang/String;)V
  #10 = Utf8               SourceFile
  #11 = Utf8               Test.java
  #12 = NameAndType        #4:#5          // "<init>":()V
  #13 = Utf8               Test
  #14 = Utf8               java/lang/Object
{
  // 构造方法
  public Test();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: return
      LineNumberTable:
        line 1: 0

  // main方法
  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      // 操作数栈深2,本地变量表长度4(this、i、j、k)
      stack=2, locals=4, args_size=1
         // 字节码
         0: iconst_1
         1: istore_1
         2: iconst_2
         3: istore_2
         4: iload_1
         5: iload_2
         6: iadd
         7: istore_3
         8: return

      // 源码中的行号与字节码行号对应关系,如:源码中 int i = 1;字节码中在第0行。
      LineNumberTable:
        line 3: 0
        line 4: 2
        line 5: 4
        line 6: 8
}
SourceFile: "Test.java"

名称 可移植性 工作效率 演示1+2
基于栈的指令集 iconst_1 //将1压入栈
iconst_2 //将2压入栈
iadd //栈顶两个元素出栈相加,压入栈顶
istore_0 //将栈顶元素保存到局部变量表第0个位置
基于寄存器的指令集 mov eax,1 //把寄存器的值设为1
add eax,2 //再把这个值加2

四、jvm组成

类加载器:将编译好的class加载到jvm中
运行时数据区:存放系统执行过程中产生的数据
执行引擎:负责执行虚拟机的字节码

五、运行时数据区

JVM定义了一系列运行时数据区域,其中一些在JVM启动时创建,退出时销毁;还有一些为线程私有,在线程创建时创建,线程退出时销毁。

运行时数据区
1、JVM栈

每个JVM线程都有一个JVM栈,栈中保存着栈帧(Frame)。JVM栈主管java方法运行过程中产生的值变量、运算结果、方法的调用和返回。


栈存储结构

如上图所示,通过method1调用method2,直至调用到method4。每执行到一个方法就会进行入栈操作;当方法执行完毕后,进行出栈操作。栈帧主要包含:局部变量表、操作数栈、动态链接、方法返回地址和一些附加信息。

如果方法深度很大,会一直进行入栈操作,从而引发StackOverflowError。

2、程序计数器:PC Register(Program Counter Register)

JVM支持多线程,每个线程都有自己的程序计数器。我们知道CPU一个时刻只能执行一个任务,当执行方法时,被更重要的任务抢走了CPU,需要记录下当前线程代码执行到哪里。如果该方法是Java方法,程序计数器会记录正在执行的JVM指令地址(如图:选中部分);如果该方法是Native方法,程序计数器的值是未定义的。

它是唯一一个不会存在内存溢出的区域

JVM指令

当执行Native方法时,怎么办? 一般虚拟机实现,都是java线程映射到Native线程上,Native线程的切换不由jvm控制,而是由Native实现决定的。当Native方法执行完毕,本地方法栈出栈,回到java方法执行。

3、堆

在Java虚拟机中堆是所有线程都可以共享的内存区域,是存放所有类实例和数组对象的地方。堆在虚拟机启动时创建,它也是垃圾收集器工作的主要区域。

堆内存里的对象不会被显式的回收,而是由垃圾回收器回收,为了配合垃圾收集器的特性我们可以把堆分为年轻代和老年代。

4、方法区、运行时常量池

方法区存储了每个类的结构信息,例如运行时常量池、字段和方法数据,以及方法和构造函数的代码等。方法区在虚拟机启动时创建,是线程共享的。

运行时常量池 包含多种常量,如:类中声明的常量、必须在运行时解析的方法和字段引用等;常量池在类或接口在虚拟机中创建的时候创建。

5、本地方法栈

本地方法栈是管理本地方法运行的,并不是所有的JVM都支持本地方法。Java虚拟机规范上, 并没有明确要求本地方法的使用语言和具体实现方法。Hotspot VM是本地方法栈和虚拟机栈合二为一的虚拟机。

相关文章

  • JVM简介(一)

    本文主要内容 JVM组成 垃圾回收机制简介 本文不涉及的内容 编译技术 JVM中class文件结构 JVM线程同步...

  • JVM(一)简介

    一、什么是jvm Java Virtual Machine,是一种规范,可以将class字节码文件转换成机器码指令...

  • JVM学习笔记

    JVM学习笔记 JVM简介 JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种...

  • JVM简介

    1.什么是JVM JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设...

  • JVM简介

    1.一段java程序是如何运行起来的呢? Java源文件,通过编译器,产生.Class字节码文件,字节码文件通过J...

  • JVM简介

    JVM是Java Virtual Machine(Java虚拟机)的缩写,是实现java跨平台特性的关键。Java...

  • JVM:简介

    写在前面 1.目前已从事Java开发接近三年,前两年忙于熟悉公司系统及业务,且一直认为程序员能实现业务开发即可(大...

  • JVM简介

    JVM基本概念 JVM是可运行java代码的假想计算机,运行在操作系统之上,与硬件没有直接交互。JVM的基本组成:...

  • JVM简介

    [TOC] 一、什么是JVM JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一...

  • JVM

    简介 Jvm 系列一:Java类的加载机制Jvm系列二:JVM内存结构 --内存泄漏与内存溢出Jvm系列三:GC算...

网友评论

      本文标题:JVM(一)简介

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