一般聊 JVM 内存模型都是把图截出来, 然后对着图, 解释上面堆, 栈之类的概念. 这篇将分享下, 如何从编程的本质上理解, JVM 内存模型是什么样子, 为什么是这个样子, 不再死记硬背.
编程的本质
编程的本质是什么, 有这么一句话, 程序 = 算法 + 数据结构.
这里的 "算法" 其实相当宽泛, 而平时理解的算法是指诸如排序, 查找等操作, 相对狭隘. 所以换一个解释, 我们把算法解释为对数据执行操作, 简称执行.
这样, 程序的本质便是数据 + 执行.
而 JVM 作为 JAVA 程序的执行载体, 必然从逻辑上与其相对应.
JVM 内存模型
因此, JVM 内存模型可以分为这么两部分: 数据区, 执行区.
数据区
任何程序, 无论实现语言, 它的数据总是可分为两类: 元数据和业务数据.
元数据, 指描述语言本身的数据, 如类信息, 指针, 引用, 即时编译代码等等.
业务数据, 是指功能需求的数据, 比如人事系统中的人员, 部门数据, 在面向对象的语言中以对象的形式存在.
而在 JVM 内存模型中, 元数据对应方法区 (Method Area), 而业务数据对应着 Java 堆 (Java Heap).
书中解释如下:
Java 堆: 存放对象实例和数组.
方法区: 存储加载的类信息, 常量, 静态变量, 即时编译代码等
因此, 图示如下.
执行区
执行部分, 首先我们得理解程序执行的基本单位是什么, 是方法 (或称函数).
通常的程序入口是 main 方法, 单元测试也是基于方法.
平时交流时, 也会说调下这个对象的方法, 而不是调下这个对象.
甚至还有专门的函数式编程.
而在 Java 中, 方法分为两种: Java 方法和 Native 方法
在内存模型中, Java 方法对应 Java 虚拟机栈 (Java Virtual Machine Stacks),Native 方法对应本地方法栈 (Native Method Stack)
书中解释如下:
Java 虚拟机栈是方法执行的内存模型.
本地方法栈为虚拟机使用 Native 方法服务.
除此之外, 再加上程序计数器 (Program Counter Register), 为当前线程所执行的字节码的提供行号指示.
主要的内存模型就画出来了.
其中, 数据区是通用的, 所以线程共有, 而执行区是线程执行自己的, 所以线程私有.
JVM 内存模型
再加上真正去执行程序的执行引擎, 链接本地方法库, JVM 内存模型就很好理解了.
对比下书上的结构, 逻辑上一致.
以上.
来源: https://www.cnblogs.com/wchukai/p/10062007.html