美文网首页一些收藏
你对常量池够了解吗

你对常量池够了解吗

作者: 贪挽懒月 | 来源:发表于2021-10-24 15:24 被阅读0次

在 java 中,常量池分为以下三种:

  • class 常量池
  • 字符串常量池
  • 运行时常量池

一、class 常量池

1. 是什么?

是class文件中的资源仓库。我们的 class 文件,用十六进制编辑器( notepad++ 安装 Hex-editor )打开,可以发现它第二行的内容是这样的:

cafe babe 0000 0033 0010 0a00 0300 0d07……

每个 class 文件用十六进制编辑器打开,开头都是 cafe babe,这个叫魔数。那么剩下的是什么意思呢?

cafe babe       0000      0033       0010             0a00 0300 0d07……
   魔数       次版本号   主版本号   常量池计数器          常量池数据区……

看到没,这里就有常量池。啊这,我说它是就是,我说就一定对吗?我们可以使用如下命令,查看字节码文件:

javap -verbose Test.class

执行之后会看到:

class常量池

看吧,我是不会骗你的!

2. 位置:

既然说了是 class 常量池,那它就是在 class 文件中。

3. 保存的数据:

class 常量池保存的东西主要有以下两类:

  • 字面量:简单地理解为等号右边的值,比如类中定义了int a = 1; String str = "hello",那么 1 和 hello 都是字面量。

  • 符号引用:类和接口的全限定名、字段的名称和描述符、方法的名称和描述符,这些就叫符号引用。

二、字符串常量池

1. 是什么?

顾名思义,就是用来保存字符串的常量池。为了提高执行效率、节省内存开销,从而整了个字符串常量池来缓存字符串数据。关于 String 的详细介绍,请参考我另一篇文章 String类相关面试题很难?不要方,问题不大

2. 位置:

  • jdk 1.7 之前,字符串常量池在方法区

  • jdk 1.7 及之后,字符串常量池在堆内存中

三、运行时常量池

1. 是什么?

当 class 文件通过 ClassLoader 加载到 JVM 内存时,会把 class 常量池 中的内容加载到方法区的一块内存中,这块内存就叫运行时常量池。

2. 位置:

运行时常量池在方法区中,jdk 1.7 极其之前方法区的实现叫永久代,jdk 1.8 开始叫元空间。

相关文章

  • 你对常量池够了解吗

    在 java 中,常量池分为以下三种: class 常量池 字符串常量池 运行时常量池 一、class 常量池 1...

  • 今天我们基于jdk8聊聊JVM-常量池,希望对大家有帮助!

    前言 本文主要讲 三种常量池, 类文件中常量池,运行时常量池,字符串常量池 各自存放的地方,以及对代码的影响 类...

  • 字符串常量池

    静态常量池,运行期常量池,字符串常量池 静态常量池 运行时常量池 字符串常量池 问题 结果: 验证new Stri...

  • java__常量池

    java的常量池分为两种型态:静态常量池和运行常量池 静态常量池: 即class文件中的常量池,这种常量池主要用于...

  • JVM-常量池

    JVM-常量池 JVM常量池分为 Class文件常量池 运行时常量池 全局字符串常量池 基本类型包装类对象常量池 ...

  • 细说Java常量池

      Java中的常量池有:class常量池、运行时常量池、String常量池。 为什么要使用常量池?   避免频繁...

  • Java 内存—常量池

    Java中的常量池分为两种型态: 静态常量池 运行时常量池 静态常量池 所谓静态常量池是指class文件中的常量池...

  • 彻底弄懂java中的常量池

    JVM有几种常量池 主要分为: Class文件常量池、运行时常量池,全局字符串常量池,以及基本类型包装类对象常量池...

  • 常量池

    Java中的常量池,实际上分为两种形态:静态常量池和运行时常量池。 静态常量池 : *.class文件中的常量池,...

  • String常量池

    java中有几种不同的常量池,以下的内容是对java中几种常量池的介绍以及重点研究一下字符串常量池。 class常...

网友评论

    本文标题:你对常量池够了解吗

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