美文网首页
JVM原理介绍三

JVM原理介绍三

作者: 生不悔改 | 来源:发表于2019-12-13 15:00 被阅读0次

    栈的详解

    栈是描述Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。

    如下图所示这是一个Math类里面有两个方法computer()和look()方法,然后执行一个main函数,创建两个Math对象,math1和math2分别掉用不同的Math类中得方法。很简单,我将根据这个例子去分析栈的情况。

    Math类

    接下来解释一下上面的main函数执行的过程。首先Math这个class类文件被类加载器加载到方法区,形成也就是图中的Math{}类元信息,除了类元信息还有方法元信息。然后执行main函数,JVM中的java栈开辟一个栈空间,类似于图中的main函数线程栈,这时候会产生一个叫栈针的内存空间(图中橘红色的部分),里面会将main函数线程中的方法进行压栈操作。这时候new一个math1的对象,对象会在堆中产生(垃圾回收的主要地方),math1对象的对象头中有个头指针会指向方法区中的Math{}类元信息(其实就是地址),同理,math2对象也是如此。接下来执行Math类中的computer()方法,会在栈针中开辟四个空间,第一个空间叫局部变量表,用于存储变量a,变量b,变量c(图中未画);第二个空间操作数栈其实就是操作引擎将给a赋值的1存在里面,操作引擎将给b赋值的2存在里面,然后操作引擎进行加减乘除后,再将算出的结果30再赋值给c。而第三个空间动态链接就是存储computer()方法地址的,因为Math{}类中的computer()方法是加载在方法区,也是有一个地址的,而这个地址在动态加载时产生,每次运行程序运行,方法地址也是不一样的,而动态链接就是指这个地址链接。第四个空间方法出口,其实就是程序调用完computer()方法后,要return c,而在return的时候程序会记住上次在main函数中运行到的地址,从而让程序能够按照顺序执行完成。例如main函数中math1执行完computer()方法return一个值后,接下来要创建一个math2对象,就是因为方法出口记录下来了程序下一步在main函数中要执行的内容地址,程序才会在跳出computer()方法后,知道回到main函数中继续执行哪行代码指令。

    注意:如果局部变量是对象的引用,该局部变量会指向堆中得对象地址,这就是我们学习JVM中常说的栈指向堆的含义。

    JVM内存

    综上就是java程序运行中的栈与堆和方法区之间的关系。

    相关文章

      网友评论

          本文标题:JVM原理介绍三

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