第一视角看方法调用时的jvm

  关于比较学术的jvm每个内存区域我之前都写过,就不重复赘述了,这里附上链接:https://www.cnblogs.com/gmt-hao/p/13603534.html, https://www.cnblogs.com/gmt-hao/p/13653218.html,这里都有详细介绍jvm内存区域分布,以及各部分的功能。今天主要从方法调用各个阶段去看各部分的变化:

  我们来看一段非常简单的代码:

public static void jvmModel(){
        int a=1;
        int b=2;
        int c = a+b;
    }

    public static void main(String[] args) {
        jvmModel();
    }

这段代码可以说简单到不能再简单了,首先调用main方法,然后main方法中调用jvmModel方法,做一些最简单的运算,但对jvm来说却一点都不简单,下面我们一步步分析:

我们上面的代码要执行首先从java文件编译成class文件,然后会加载到jvm内存当中(方法区),类加载器会找到对应路径类的二进制字节流,经过验证,解析等一系列流程(保证这个class文件安全可靠)之后,将类信息(如类完整路径名,修饰符,方法名,静态变量等等)存放在方法区中,而class对象实体其实还是在堆中的,之后由执行引擎接受开始执行方法。

 

 

 

 

 

   图二可以看到,方法在运行时,很多操作都是由执行引擎来处理的,详细的流程:main方法执行,首先需要分配给main线程一个独立的内存块,然后会给当前线程生成一个栈帧压进去,开始调用时,字节码引擎修改程序计数器的值来记录调用位置,接下来调用jvmModel方法,又会生产一个栈帧压进去,每个栈帧都会由记录局部变量的表,像jvmModel中需要计算的过程数值则会存在操作数栈中(计算机做不到和人脑一样,它只能一步一步执行,因此需要将过程数据记录下来),执行完成到从方法出口跳出去,退栈,main栈帧又到最顶端,继续执行完成,退栈结束。

  基本上方法执行的大体流程就是这样,而当新生代Eden区满了或者老年代满了都会字节码执行引擎会分别触发minor gc和full gc,执行垃圾回收的流程。

  具体关于垃圾回收我之前也有过详细介绍,这里也不重复赘述,放上链接:https://www.cnblogs.com/gmt-hao/p/13843250.html

 

总结:

  这一篇最大的意义是将一些概念化的东西和我们实际的写的代码给串起来,其实在学习jvm的过程中,很多概念性的东西都是靠背,很多时候都是在想,学这个东西有什么意义,我们平时写代码压根就不会接触,然而这些都是我们写代码的体现,了解我们写的代码jvm的角度是怎么看的还是挺有意思的吧。

 

 

 

posted @ 2022-02-21 23:26  吃肉不长肉的小灏哥  阅读(39)  评论(0编辑  收藏  举报