常量池

主要包括下面2类:

  1. 字面量(Literal):如int,double,String等;
  2. 符号引用(Symbolic Reference);

符号引用

  1. 类和接口的全限定名;
  2. 字段的名称和描述符;
  3. 方法的名称和描述符;

当虚拟机运行时,需要从常量池中获取对应的符号引用,再在类创建时或运行时解析、翻译到具体的内存地址之中;

常量池的项目类型(常量类型)

常量池中常量项的结构总表

说明: 下图中的tag值即上图中的标志值


解析Class文件指令

javap -verbose xxxx

其中xxxx表示的是xxxx.class

如程序TestClass.java


public class TestClass {
private int m; public int inc() {
return m + 1;
}
}

编译后生成的二进制Class文件内容如下:

 Offset: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00000000: CA FE BA BE 00 00 00 32 00 16 07 00 02 01 00 09 J~:>...2........
00000010: 54 65 73 74 43 6C 61 73 73 07 00 04 01 00 10 6A TestClass......j
00000020: 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 01 ava/lang/Object.
00000030: 00 01 6D 01 00 01 49 01 00 06 3C 69 6E 69 74 3E ..m...I...<init>
00000040: 01 00 03 28 29 56 01 00 04 43 6F 64 65 0A 00 03 ...()V...Code...
00000050: 00 0B 0C 00 07 00 08 01 00 0F 4C 69 6E 65 4E 75 ..........LineNu
00000060: 6D 62 65 72 54 61 62 6C 65 01 00 12 4C 6F 63 61 mberTable...Loca
00000070: 6C 56 61 72 69 61 62 6C 65 54 61 62 6C 65 01 00 lVariableTable..
00000080: 04 74 68 69 73 01 00 0B 4C 54 65 73 74 43 6C 61 .this...LTestCla
00000090: 73 73 3B 01 00 03 69 6E 63 01 00 03 28 29 49 09 ss;...inc...()I.
000000a0: 00 01 00 13 0C 00 05 00 06 01 00 0A 53 6F 75 72 ............Sour
000000b0: 63 65 46 69 6C 65 01 00 0E 54 65 73 74 43 6C 61 ceFile...TestCla
000000c0: 73 73 2E 6A 61 76 61 00 21 00 01 00 03 00 00 00 ss.java.!.......
000000d0: 01 00 02 00 05 00 06 00 00 00 02 00 01 00 07 00 ................
000000e0: 08 00 01 00 09 00 00 00 2F 00 01 00 01 00 00 00 ......../.......
000000f0: 05 2A B7 00 0A B1 00 00 00 02 00 0C 00 00 00 06 .*7..1..........
00000100: 00 01 00 00 00 02 00 0D 00 00 00 0C 00 01 00 00 ................
00000110: 00 05 00 0E 00 0F 00 00 00 01 00 10 00 11 00 01 ................
00000120: 00 09 00 00 00 31 00 02 00 01 00 00 00 07 2A B4 .....1........*4
00000130: 00 12 04 60 AC 00 00 00 02 00 0C 00 00 00 06 00 ...`,...........
00000140: 01 00 00 00 06 00 0D 00 00 00 0C 00 01 00 00 00 ................
00000150: 07 00 0E 00 0F 00 00 00 01 00 14 00 00 00 02 00 ................
00000160: 15 .

解析示例:

Offset:00000008~00000009: 0x0016-->22 表示有22-1=21个常量;

使用

javap -verbose TestClass

进行解析,后生成如下:

Compiled from "TestClass.java"
public class TestClass extends java.lang.Object
SourceFile: "TestClass.java"
minor version: 0
major version: 50
Constant pool:
const #1 = class #2; // TestClass
const #2 = Asciz TestClass;
const #3 = class #4; // java/lang/Object
const #4 = Asciz java/lang/Object;
const #5 = Asciz m;
const #6 = Asciz I;
const #7 = Asciz <init>;
const #8 = Asciz ()V;
const #9 = Asciz Code;
const #10 = Method #3.#11; // java/lang/Object."<init>":()V
const #11 = NameAndType #7:#8;// "<init>":()V
const #12 = Asciz LineNumberTable;
const #13 = Asciz LocalVariableTable;
const #14 = Asciz this;
const #15 = Asciz LTestClass;;
const #16 = Asciz inc;
const #17 = Asciz ()I;
const #18 = Field #1.#19; // TestClass.m:I
const #19 = NameAndType #5:#6;// m:I
const #20 = Asciz SourceFile;
const #21 = Asciz TestClass.java; {
public TestClass();
Code:
Stack=1, Locals=1, Args_size=1
0: aload_0
1: invokespecial #10; //Method java/lang/Object."<init>":()V
4: return
LineNumberTable:
line 2: 0 LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this LTestClass; public int inc();
Code:
Stack=2, Locals=1, Args_size=1
0: aload_0
1: getfield #18; //Field m:I
4: iconst_1
5: iadd
6: ireturn
LineNumberTable:
line 6: 0 LocalVariableTable:
Start Length Slot Name Signature
0 7 0 this LTestClass; }

【JVM】Class结构之常量池的更多相关文章

  1. class字节码结构(零:补充:class结构,常量池,字节码指令)

    JVM高级特性与实践(五):实例探究Class类文件 及 常量池 JVM高级特性与实践(六):Class类文件的结构(访问标志,索引.字段表.方法表.属性表集合) JVM高级特性与实践(七):九大类字 ...

  2. 深入理解JVM内存分配和常量池

    一.虚拟机的构成 虚拟结主要由运行时数据区.执行引擎.类加载器三者构成: 而我们所说的JVM内存模型指的就是运行时数据区,下面具体分析一下运行时数据区: 二.运行时数据区组成和各个区域的作用 我们看到 ...

  3. JVM之运行时常量池(Runtime Constant Pool)

    基本特性: 方法区的一部分,在方法去中分配,加载泪或者接口后就创建运行时常量区. class文件每一个类或接口的常量池表(constant_pool table)的运行时表现形式, 包括编译期的数值字 ...

  4. 用jvm指令分析String 常量池

    其他博友的不同理解方式:  http://hi.baidu.com/boywell/item/d5ee5b0cc0af55c875cd3cfd 我们先来看一个类 public class javaPT ...

  5. 超过1W字深度剖析JVM常量池(全网最详细最有深度)

    面试题:String a = "ab"; String b = "a" + "b"; a == b 是否相等 面试考察点 考察目的: 考察对 ...

  6. JVM体系结构之七:持久代、元空间(Metaspace) 常量池==了解String类的intern()方法、常量池介绍、常量池从Perm-->Heap

    一.intern()定义及使用 相信绝大多数的人不会去用String类的intern方法,打开String类的源码发现这是一个本地方法,定义如下: public native String inter ...

  7. Jvm虚拟机结构与机制

    JVM(Java Virtual Machine)在研究JVM的过程中会发现,其实JVM本身就是一个计算机体系结构,很多原理和我们平时的硬件.微机原理.操作系统都有十分相似的地方,所以学习JVM本身也 ...

  8. java基础(八) 深入解析常量池与装拆箱机制

    引言   本文将介绍常量池 与 装箱拆箱机制,之所以将两者合在一起介绍,是因为网上不少文章在谈到常量池时,将包装类的缓存机制,java常量池,不加区别地混在一起讨论,更有甚者完全将这两者视为一个整体, ...

  9. Java内存中的常量池

    1,java内存模型简介 <深入理解java虚拟机>里将java内存分为如下五个模块: 堆-堆是所有线程共享的,主要用来存储对象. 其中,堆可分为:新生代和老年代两块区域.使用NewRat ...

随机推荐

  1. js 下载文件的操作方法

    https://blog.csdn.net/zhoumengshun/article/details/71405963

  2. java-抽象类的成员特点

    1.成员变量:既可以是变量,也可以是常量.abstract不能修饰成员变量. 2.构造方法:有.用于子类访问父类数据的初始化. 3.成员方法:既可以是抽象的,也可以是非抽象的. - 抽象方法:强制要求 ...

  3. Odoo9以后的社区版本和企业版功能上的区别

    Odoo9以后的社区版本和企业版除了授权模式的区别外,整理功能上的区别 透过功能设置菜单整理的区别如下,主要功能模块. 未包括所有模块,毕竟模块太多了. 以下是企业版有,而社区版没有的功能.

  4. Go Example--函数

    package main import ( "fmt" ) func main() { res := plus(1,2) fmt.Println("1+2=", ...

  5. LG3975 [TJOI2015]弦论

    题意 题目描述 为了提高智商,ZJY开始学习弦论.这一天,她在< String theory>中看到了这样一道问题:对于一个给定的长度为n的字符串,求出它的第k小子串是什么.你能帮帮她吗? ...

  6. 你真的了解word-wrap和word-break的区别吗? (转载)

    这两个东西是什么,我相信至今还有很多人搞不清,只会死记硬背的写一个word-wrap:break-word;word-break:break-all;这样的东西来强制断句,又或者是因为这两个东西实在是 ...

  7. lsusb

    1.lsusb查看系统的USB设备 $ lsusb Bus Device : ID : Kingston Technology Bus Device : ID 1d6b: Linux Foundati ...

  8. Makefile introduction (very old presentation)

  9. Unity Shader 入门精要学习 (冯乐乐 著)

    第1篇 基础篇 第1章 欢迎来到Shader的世界 第2章 渲染流水线 第3章 Unity Shader 基础 第4章 学习Shader所需的数学基础 第2篇 初级篇 第5章 开始Unity Shad ...

  10. webpack 入口:entry

    定义一个入口点就生成一个chunk.如果你只是用字符串的方式定义了一个入口点,其就被命名为main.如果你用对象的方式定义多个入口点,其就被命名为入口对象中的键值.下面两个例子是等价的: entry: ...