【JVM】Class结构之常量池
常量池
主要包括下面2类:
- 字面量(Literal):如int,double,String等;
- 符号引用(Symbolic Reference);
符号引用
- 类和接口的全限定名;
- 字段的名称和描述符;
- 方法的名称和描述符;
当虚拟机运行时,需要从常量池中获取对应的符号引用,再在类创建时或运行时解析、翻译到具体的内存地址之中;
常量池的项目类型(常量类型)
常量池中常量项的结构总表
说明: 下图中的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结构之常量池的更多相关文章
- class字节码结构(零:补充:class结构,常量池,字节码指令)
JVM高级特性与实践(五):实例探究Class类文件 及 常量池 JVM高级特性与实践(六):Class类文件的结构(访问标志,索引.字段表.方法表.属性表集合) JVM高级特性与实践(七):九大类字 ...
- 深入理解JVM内存分配和常量池
一.虚拟机的构成 虚拟结主要由运行时数据区.执行引擎.类加载器三者构成: 而我们所说的JVM内存模型指的就是运行时数据区,下面具体分析一下运行时数据区: 二.运行时数据区组成和各个区域的作用 我们看到 ...
- JVM之运行时常量池(Runtime Constant Pool)
基本特性: 方法区的一部分,在方法去中分配,加载泪或者接口后就创建运行时常量区. class文件每一个类或接口的常量池表(constant_pool table)的运行时表现形式, 包括编译期的数值字 ...
- 用jvm指令分析String 常量池
其他博友的不同理解方式: http://hi.baidu.com/boywell/item/d5ee5b0cc0af55c875cd3cfd 我们先来看一个类 public class javaPT ...
- 超过1W字深度剖析JVM常量池(全网最详细最有深度)
面试题:String a = "ab"; String b = "a" + "b"; a == b 是否相等 面试考察点 考察目的: 考察对 ...
- JVM体系结构之七:持久代、元空间(Metaspace) 常量池==了解String类的intern()方法、常量池介绍、常量池从Perm-->Heap
一.intern()定义及使用 相信绝大多数的人不会去用String类的intern方法,打开String类的源码发现这是一个本地方法,定义如下: public native String inter ...
- Jvm虚拟机结构与机制
JVM(Java Virtual Machine)在研究JVM的过程中会发现,其实JVM本身就是一个计算机体系结构,很多原理和我们平时的硬件.微机原理.操作系统都有十分相似的地方,所以学习JVM本身也 ...
- java基础(八) 深入解析常量池与装拆箱机制
引言 本文将介绍常量池 与 装箱拆箱机制,之所以将两者合在一起介绍,是因为网上不少文章在谈到常量池时,将包装类的缓存机制,java常量池,不加区别地混在一起讨论,更有甚者完全将这两者视为一个整体, ...
- Java内存中的常量池
1,java内存模型简介 <深入理解java虚拟机>里将java内存分为如下五个模块: 堆-堆是所有线程共享的,主要用来存储对象. 其中,堆可分为:新生代和老年代两块区域.使用NewRat ...
随机推荐
- C语言-第一周作业
要求1: 请在你的PC或者移动设备上安装词典,该词典工具能对计算机术语进行翻译.需要在你的博客中给出安装软件的截图,请确保阅读者能从截图判断出你的被安装的设备是PC或者移动设备.(5经验值) 要求2: ...
- heap 的一些用法
noip 合并果子 #include<bits/stdc++.h> using namespace std; int heap[maxn]; ; void input(int d) { ...
- 《DSP using MATLAB》Problem 7.1
只有春节那么几天才能和家人团聚,看着爸爸妈妈一年比一年老,自己还是一无所有,照顾好自己尚且惭愧,真是悲从中来,又能怎么办呢, 唯有奋发努力,时不我待,多想想怎么赚钱,加油. 代码: function ...
- python------模块定义、导入、优化 ------time模块
1.模块介绍 2.time & datetime 3.random 4.os 5.sys 6.shutil 7.json & pickle 8.shelve 9.xml处理 10.ya ...
- 【BZOJ2120】数颜色
看代码学习好,好学好懂好ac 原题: 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中 ...
- 使用VUE搭建tab标签组件
Vue2.0 多 Tab切换组件简单封装,满足自己简单的功能,可以直接拿去使用! 首先上效果图: 功能简单介绍: 1.支持tab切换 2.支持tab定位 3.支持tab自动化 仿React多Tab实现 ...
- day 53 js学习之
---恢复内容开始--- 1.昨日作业讲解 弄一个上图一样的选择器,可以全选,可以反选,取消 <!DOCTYPE html> <html lang="zh-CN" ...
- Android开发之GridView的使用(解读谷歌官方API)
GridView将图片显示在二维可移动的网格里.使用ListAdapter能够将Grid项目自己主动填充满整个布局. 以下我们依据官方文档的样例来实现一下使用GridView,点击视图里的 ...
- 关于margin padding
margin padding设置百分比是以父元素的宽度作参考. 定位的left,top等取百分比 则以参照定位元素的padding+width做参考 margin 四个同时设定 以margin-lef ...
- 标 题: JavaScript真的要一统江湖了
http://www.newsmth.net/nForum/#!article/Python/125347?p=4 标 题: JavaScript真的要一统江湖了 发信站: 水木社区 (Fri Se ...