7、通过一个实例来了解jvm的运行过程

一个程序大概执行流程:
7、通过一个实例来了解jvm的运行过程

jvm主要分为三个部分(执行过程):类装载子系统 -> jvm内存模型(运行时数据区中:浅蓝色为线程私有,灰黄色为线程共有) -> 执行引擎

现在通过下面的这个例子来更加深刻的理解上面的流程
7、通过一个实例来了解jvm的运行过程

  • 1、java代码编译生成字节码文件(编译器)

  • 2、jvm调用字节码文件,启动类装载子系统

  • 3、加载完成以后来到程序的入口:main方法

  • 4、我们看到,main方法主要做了两件事儿,一:创建math类的实例,(new 关键字会将math实例存储在 中),二:调用compute方法。

    • 4.1、这里在重提一下堆的内存空间,堆分为了年轻代(三分之一)和老年代(三分之二)
      7、通过一个实例来了解jvm的运行过程

    • 4.2、新建的对象先会进入Eden(伊甸园区…),满了之后会进行一波minor gc(执行引擎),然后没有回收掉的一些东西会进入from,form满了会进入to(survivor区不会出发GC,并且 总有一个区(from,to)是空的,因为他们是复制的,该数据15次之后就会进入老年区),然后进入老年区,(注意,老年的区的曲线图应该是一直增长,然后不变(满了)),老年代垃圾清理是 full GC,当所有区都满了就会报错,

      各位可以自己去做个试验 (循环创建新的对象) ,下面的数据图来源(visualvm)
      7、通过一个实例来了解jvm的运行过程

  • 5、创建好实例,去调用compute方法时,会将对应的一系列的变量存入 中。(栈用来存放一些运行时的局部变量)

  • 6、进入compute方法,就进入了栈
    我们通过反汇编,拿到反汇编代码。可以看到,compute方法的详细执行流程 可以通过:jvm指令手册 来查看具体的含义
    7、通过一个实例来了解jvm的运行过程
    具体而言就是做了如下的事情:

    将1压入操作数栈(iconst_1,此命令中的数字1代表的是第一个位置的局部变量的意思),然后在赋值给局部变量表中给的a(istore_1),2也同理,指令前面的数字就是程序计数器 所记录的数字,一步步的执行结束以后,会将执行的结果返回(ireturn),也就到了方法出口;

    idea中怎么查看class的反汇编代码?

    1、找到你想反汇编的class文件,一般在target文件下,点击 open in terminal
    7、通过一个实例来了解jvm的运行过程
    2、键入命令:javap -c s.class > s.txtjavap -c 是反编译文件的命令(自带),s.class是指定我们反编译的字节码文件,> s.txt在当前目录生成反编译好的txt文件。(javap -v可以生成更加详细的反编译代码)

    3、然后在对应的目录下就可以看到生成的反汇编代码
    7、通过一个实例来了解jvm的运行过程
    7、最后的流程:7、通过一个实例来了解jvm的运行过程
    我们可以看到,运行时数据区(即内存模型)之间是相互有联系的