`
jimmee
  • 浏览: 530121 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

java字节码常量池处理说明

阅读更多

1. 根据java的字节码格式说明,常量池中每一项的大小不一样的。运行时,若要通过数组索引获取具体的一项时,

必须要经过一定的处理才能根据数组下标进行处理,具体的实现原理实际上就是空间换时间,可以参考kvm的实现:

 

每一项的定义,采用的是union的定义(会取最大的字节数进行内存分配)

 

/* Each of these represents one entry in the constant pool */
union constantPoolEntryStruct {
    struct { 
        unsigned short classIndex;
        unsigned short nameTypeIndex;
    }               method;  /* Also used by Fields */
    CLASS           clazz;
    INTERNED_STRING_INSTANCE String;
    cell           *cache;   /* Either clazz or String */
    cell            integer;
    long            length;
    NameTypeKey     nameTypeKey;
    NameKey         nameKey;
    UString         ustring;
};

 

2. 常量池的定义:

注意:这里有多少个数组元素,实际上不确定的,这里只是占位而已,具体使用时是通过分配不同的

内存大小实现可变大小。

 

struct constantPoolStruct { 
    union constantPoolEntryStruct entries[1];
};

 

typedef struct constantPoolStruct*     CONSTANTPOOL;


 ConstantPool = (CONSTANTPOOL)callocPermanentObject(tableSize);

 

1
5
分享到:
评论

相关推荐

    jclasslib.rar_Java 8_java8 下载_java字节码查看工具;_jclasslib.jar_允许修改Jav

    jclasslib是一款免费开源的java字节码查看工具,该软件不但可以查看java字节码,同时还包含一个类库允许开发者读取,修改,写入Java Class文件与字节码。简单的说:用户可以通过jclasslib修改jar包下面的类,是一个...

    JVM常量池教程吐血整理干货.md

    当Java源文件被编译后,就会生成Class字节码文件。 Class常量池就存在于Class文件中(Class文件的Constant Pool中)。 Class文件常量池主要存放两大常量:字面量和符号引用。 字面量: 字面量分为文本字符串(如: "abc...

    Java字节码中的一些特定处理

     · 常量池大小设定  · stackMapTable属性  · new指令后的dup  · attribute属性  · long和double的特殊处理  · monitorenter和monitorexit的使用场景  · enclosingMethod属性  · ...

    JVM执行子系统-JVM进阶

    各种不同平台的虚拟机与所有平台都统一使用的程序存储格式——字节码(ByteCode)是 构成平台无关性的基石,也是语言无关性的基础。Java 虚拟机不和包括 Java 在内的任何 语言绑定,它只与“Class 文件”这种特定的...

    Java进阶教程解密JVM视频教程

    学习字节码指令的的运行流程,字节码指令与常量池、方法区的关系。掌握条件分支、循环控制、异常处理、构造方法在字节码级别的实现原理,利用HSDB工具理解多态原理。还会涉及从编译期的语法糖处理,到类加载的各个...

    JD-GUI,JDGUI,java反编译工具

    java反编译工具: JD-GUI JD-GUI 是一个用 C++ 开发的 Java 反编译工具... (它的作用就是根据class字节码文件,反解析出当前类对应的code区(汇编指令)、本地变量表、异常表和代码行偏移量映射表、常量池等等信息。)

    java虚拟机规范 jdk8.

    书中不仅完整地讲述了由Java SE 8所引入的新特性,例如对包含默认实现代码的接口方法所做的调用,还讲述了为支持类型注解及方法参数注解而对class文件格式所做的扩展,并阐明了class文件中各属性的含义,以及字节码...

    Java虚拟机规范(Java SE 8版)

    也就是《Lambda Expressions for the Java Programming Language》(Java编程语言的lambda表达式)时,Oracle公司的Dan Smith向虚拟机实现者咨询了将default方法集成到常量池和方法结构、方法与接口方法解析算法,...

    BinCode:Java字节码反汇编框架

    BinCode Bincode是一个用于读取,操作和编写Java ByteCode的库。 要获得支持和讨论,请加入 特征: .class格式解析[进行中] 助理[进行中] ...Bincode是一个低级库,并且诸如常量池之类​​的功能未抽象

    Java常见面试问题整理.docx

    运行时常量池是方法区的一部分,class文件除了有类的字段、接口、方法等描述信息之外,还有常量池用于存放编译期间生成的各种字面量和符号引用。在老版jdk,方法区也被称为永久代。在1.8之后,由于永久代内存经常...

    xwiki-rendering-syntax-doxia-5.0.1.zip

    constant-pool-scanner.zip,扫描Java字节码以查找常量池中的类引用的简单实用程序。

    java-内存-方法区介绍

    存放类的class字节码信息、静态与非静态方法、静态成员变量、常量、字符串常量池

    深入Java虚拟机(原书第2版).pdf【附光盘内容】

    3.4.3 第三趟:字节码验证 3.4.4 第四趟:符号引用的验证 3.4.5 二进制兼容 3.5 java虚拟机中内置的安全特性 3.6 安全管理器和java api 3.7 代码签名和认证 3.8 一个代码签名示例 3.9 策略 3.10...

    Java虚拟机

    第三部分分析了虚拟机的执行子系统,包括类文件结构、虚拟机类加载机制、虚拟机字节码执行引擎。第四部分讲解了程序的编译与代码的优化,阐述了泛型、自动装箱拆箱、条件编译等语法糖的原理;讲解了虚拟机的热点探测...

    深入理解_Java_虚拟机 JVM_高级特性与最佳实践

    Java内存区域与内存溢出异常 / 24 2.1 概述 / 24 2.2 运行时数据区域 / 25 2.2.1 程序计数器 / 25 2.2.2 Java虚拟机栈 / 26 2.2.3 本地方法栈 / 27 2.2.4 Java堆 / 27 2.2.5 方法区 / 28 2.2.6 运行时常量池 ...

    java相关的2024面试题集锦

    生成这4条指令的最常见的Java代码场景是:使用new关键字实例化对象的时候、读取或者设置一个类的静态字段(被final修饰、已在编译器把结果放入常量池的静态字段除外)的时候,以及调用一个类静态方法的时候 ...

    深入Java虚拟机

    3.4.3 第三趟:字节码验证 3.4.4 第四趟:符号引用的验证 3.4.5 二进制兼容 3.5 Java虚拟机中内置的安全特性 3.6 安全管理器和Java API 3.7 代码签名和认证 3.8 一个代码签名示例 3.9 策略 3.10...

    详解JAVA类加载机制(推荐)

    字节码文件格式主要分为两部分:常量池和方法字节码。 二、类加载 类的生命周期是从被加载到虚拟机内存中开始,到卸载出内存结束。过程共有七个阶段,其中到初始化之前的都是属于类加载的部分 加载—-验证—-准备—-...

    JVM内一个对象的生死存亡

    在编译期,编译器会将 Tested.java类转换成 Tested.class 字节码文件。当虚拟机接收到new 字节码指令时,如果此时类还未被初始化,则虚拟机会先进行类的初始化过程。 1. 虚拟机会通过 Tested.class 文件内的全限定名...

Global site tag (gtag.js) - Google Analytics