再探JVM内存模型,冲冲冲

以前学JVM的时候看过《深入理解JVM》,当时看的很模糊也记了些笔记,更像是为了应付面试。事实是确实把笔记都背上了,春招找实习的时候,内存管理、类加载、垃圾回收三连背一遍。后来自己做项目的时候,涉及到JVM的部分还是不怎么理解,最近重读了上面的书并且看了一些技术大佬的专栏,用博客记录下自己学习过程与思考。

本篇文章关注两个问题:

Java字节码是什么?Java源代码怎么变成Java字节码的?

Java字节码进入JVM后是怎么存储的?
  为了解释上面问题,假设现在我们有一个Main类,调用compute方法执行计算操作,代码如下:
  public class Math {
public static final Integer CONSTANT = 10;

public int compute() {
    int a = 1;
    int b = 2;
    int c = (a + b) * 10;
    return c;
}

public static void main(String[] args) {
    Math math1 = new Math();
    Math math2 = new Math();
    math1.compute();
    math2.compute();
}

}

我们对着字节码文件来阐述。虚拟机栈又叫做线程栈,生命周期与线程相同。栈主要由局部变量表、操作数栈、动态链接、方法出口组成。当main方法运行时JVM会在栈内存区域给主线程分配一块内存,main方法和compute方法执行时,会创建单独的栈帧用于存储方法的一些信息。

局部变量表:存放的是方法在执行时各种基本类型和引用类型变量,以及returnAddress类型(指向了一条字节码指令的地址);
方法出口:保存的是方法执行完后回到主线程的哪个位置。对于main栈帧,局部变量表里的math变量存放的是堆内存中math变量的地址。
操作数栈:临时存放方法执行时的变量
动态链接:Class 文件中存放了大量的符号引用,这些符号引用指向的是方法。程序运行期间调用方法时,根据运行时常量池的参数,静态符号引用变成直接引用;对象头里的指针会动态的找到方法区中存储的调用方法的信息。

你可能感兴趣的:(再探JVM内存模型,冲冲冲)