首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解常量池的javap输出

理解常量池的javap输出
EN

Stack Overflow用户
提问于 2011-04-05 09:48:14
回答 3查看 14K关注 0票数 25

在一个非常简单的HelloWorld应用程序上运行javap时,我对常量池的输出感到困惑。

测试代码

代码语言:javascript
复制
public class TestClass {
    public static void main(String[] args) {
        System.out.println("hello world");
    }
}

Javap -c -verbose输出(截取)

代码语言:javascript
复制
// Header + consts 1..22 snipped
const #22 = String      #23;    //  hello world
const #23 = Asciz       hello world;

public static void main(java.lang.String[]);
  Signature: ([Ljava/lang/String;)V
  Code:
   Stack=2, Locals=1, Args_size=1
   0:   getstatic       #16; //Field java/lang/System.out:Ljava/io/PrintStream;
   3:   ldc     #22; //String hello world
   5:   invokevirtual   #24; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   8:   return
  // Debug info snipped
}

好的,在第三行,我们看到"hello world“常量通过#22被推到堆栈上,但是const #23似乎持有实际的值。我想我有点困惑,当#(数字)出现在打印输出的右侧时它是什么意思。

Oracle/Sun's man page for javap还有很多需要改进的地方。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-04-05 10:12:03

所有的classinterfacefield名称和string常量都放入java 常量池中。

根据虚拟机规格( http://java.sun.com/docs/books/jvms/second_edition/html/ClassFile.doc.html ):

constant_pool是一个结构表(§4.4),表示ClassFile结构及其子结构中引用的各种字符串常量、类和接口名称、字段名称以及其他常量。每个constant_pool表条目的格式由它的第一个“标签”字节表示。constant_pool表的索引从1到constant_pool_count-1。

因此,就常量池而言,可以将如下内容视为:

代码语言:javascript
复制
const #22 = String      #23;    //  hello world
const #23 = Asciz       hello world;

#22处的值(索引22)的类型为String,其值为null终止c字符串(Asciz),hello world位于索引23处。

票数 26
EN

Stack Overflow用户

发布于 2011-04-05 10:12:11

Java常量池在存储字符串时存储两种不同类型的条目。首先,它将字符串文本存储为UTF-8编码的数据(这里是常量#23)。其次,它还存储一个字符串项(#22),指示应使用常量#23的内容来构造String。我认为这样做的原因是JVM与每个类关联了一个“运行时常量池”,该池由给定常量的动态实现组成。对于字符串,这可以是对包含给定字符的interned String对象的引用。除了字符串之外,UTF-8常量数据还有其他用途(例如,命名字段和类),因此这种额外的间接性似乎是分离问题的合理方法。

票数 5
EN

Stack Overflow用户

发布于 2011-04-05 10:09:48

池条目#22是一个java.lang.String对象。Entry #23是用于构造该字符串的字符数组。

Java VM Spec是javap的“缺失手册”。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5546280

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档