动态链接

每个栈帧都包含一个指向运行时常量池中该栈帧所属方法的引用,持有这个引用是为了支持方法调用过程中的动态连接. 动态链接就是将常量池中的符号引用在运行期转化为直接引用。

比如:描述一个方法调用了另外的其他方法时,就是通过常量池中指向方法的符号引用来表示的,那么动态链接的作用就是为了将这些符号引用转换为调用方法的直接调用

即:符号引用动态的运行时候转成直接引用。

Java虚拟机内存结构【待整理,整理完了删除掉】 - 图1

非虚方法:如果方法在编译器就确定了具体的调用版本,这个版本在运行时是不可变的。这样的方法称为非虚方法

静态方法、私有方法、final 方法、实例构造器、父类方法都是非虚方法

其他方法就是虚方法:(子类对象的多态性的前提):1. 类的继承关系 2. 方法可重写

方法出口

当一个方法执行完毕之后,要返回之前调用它的地方,因此在栈帧中必须保存一个方法返回地址。
但是出现异常会不会返回地址

本地方法栈

与虚拟机栈的作用是一样的,只不过虚拟机栈是服务 Java 方法的,而本地方法栈是为虚拟机调用 Native 方法 (不一定是 Java 开发的) 服务的

(1)调用本地 native 的内存模型。
(2)线程独享。

堆(Heap)

Java 虚拟机中内存最大的一块,是被所有线程共享的,在虚拟机启动时创建, 几乎所有的对象实例都在这里分配内存,几乎所有的对象实例都在这里创建,因此该区域经常发生垃圾回收操作。

在 Java 中,堆被划分成两个不同的区域:新生代 (Young)、老年代 ( Old )。

Java虚拟机内存结构【待整理,整理完了删除掉】 - 图2

堆:初始化的对象,成员变量 (那种非 static 的变量),所有的对象实例和数组几乎都要在堆上分配 (逃逸分析的不在堆上创建)
Java 对象存储的地方, 初始化的对象放在堆里面,引用放在栈里面,
(1)Java 堆是虚拟机管理的内存中最大的一块
(2)Java 堆是所有线程共享的区域
(3)在虚拟机启动时创建
(4)此内存区域的唯一目的就是存放对象实例,几乎所有对象实例都在这里分配内存。存放 new 生成的对象和数组
(5)Java 堆是垃圾收集器管理的内存区域,因此很多时候称为 “GC 堆”

方法区

用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据 静态变量 + 常量 + 类信息(版本、方法、字段等)+ 运行时常量池存在方法区中

方法区是线程间共享的,当两个线程同时需要加载一个类型时,只有一个类会请求 ClassLoader 加载,另一个线程会等待。

Java虚拟机内存结构【待整理,整理完了删除掉】 - 图3

静态常量池 存在于 class 文件中,比如经常使用的 javap -verbose 中,常量池总是在最前面

运行时常量池:就是在 class 文件被加载进了内存之后,常量池保存在了方法区中,通常说的常量池 指的是运行时常量池。所以呢,讨论的都是运行时常量池

https://blog.csdn.net/pmdream/article/details/105480411

https://blog.csdn.net/weixin_45393094/article/details/106163605