JVM内存模型-1

91 阅读2分钟


「这是我参与2022首次更文挑战的第15天,活动详情查看:2022首次更文挑战」。

方法区

方法区是JVM规范中定义的一个逻辑内存,在JDK1.8以前对方法区的实现叫做“永久代”,然而在JDK1.8以后讲“永久代”废弃,改为“元空间”对其方法区进行实现,并且存储位置是本地内存,但是它依旧是JVM的逻辑区域。方法区存储了每一个类的结构信息 、常量、静态变量、即时编译器编译后的代码缓存等数据。 在这里插入图片描述

常量池

静态常量池

Class文件中除了有类的版本、字段、方法、接口等信息外,还有一个常量池用于存放编译器间生成的字面量和符号引用。这些内容在类加载完成后转存到运行时常量池中。

  • 字面量:给基本类型变量和包装类、字符串赋值的方式就是字面量,比如int a = 1,这里的1就是字面量;比如String b = “b”,这里的"b"就是字面量。
  • 符号引用:符号引用是以一组符号来描述引用的目标。因为在java文件编译成class文件的时候,虚拟机并不知道字段所引用的对象的实际内存地址,就用符号引用来替代,等到类加载解析阶段将其符号引用转为内存地址的直接引用。符号引用是可以以任何形式的字面量,比如类的全限定名。只要能唯一定位到目标位置都可以。

运行时常量池

运行时常量池具有动态特性,它是每一个类(或接口)在运行时的表现形式,它存储了类加载解析后的符号引用和字面量。在JDK1.7以后将其实际内存移入堆中,但逻辑上仍属于方法区。

字符串常量池

在JDK1.8后字符串常量池划入堆内存,因为String类型的对象在开发过程中使用的频率和它的内存结构特殊,所以JVM开发者设计了字符串常量池来提升性能。