翻译:JVM虚拟机规范1.7中的运行时常量池部分(三)

4.4.7. The CONSTANT_Utf8_info Structure

The CONSTANT_Utf8_info structure is used to represent constant string values:

代表常量字符串。

The items of the CONSTANT_Utf8_info structure are as follows:

条目如下:

tag

The tag item of the CONSTANT_Utf8_info structure has the value CONSTANT_Utf8 (1).

tag值为CONSTANT_Utf8

length

The value of the length item gives the number of bytes in the bytes array (not the length of the resulting string).

bytes数组的长度

bytes[]

The bytes array contains the bytes of the string.

No byte may have the value (byte)0.

No byte may lie in the range (byte)0xf0 to (byte)0xff.

该数组包含字符串的字节。

不能包含0.

不能在0xf0 到 (byte)0xff.范围内

String content is encoded in modified UTF-8. Modified UTF-8 strings are encoded so that code point sequences that contain only non-null ASCII characters can be represented using only 1 byte per code point, but all code points in the Unicode codespace can be represented. Modified UTF-8 strings are not null-terminated. The encoding is as follows:

翻译:字符串内容以修改后的UTF-8编码。修改版UTF-8编码后,仅包含非空ASCII字符的码点序列能够用(每个码点一个1字节)来标识,但是所有的Unicode代码段中的码点能够被标识。

  • Code points in the range ‘\u0001‘ to ‘\u007F‘ are represented by a single byte:

The 7 bits of data in the byte give the value of the code point represented.

  翻译:‘\u0001‘ to ‘\u007F‘ 用单字节标识

  • The null code point (‘\u0000‘) and code points in the range ‘\u0080‘ to ‘\u07FF‘ are represented by a pair of bytes x and y :

The two bytes represent the code point with the value:

翻译:空码点(‘\u0000‘) 和 ‘\u0080‘ to ‘\u07FF‘ 范围内的可以用x和y来标识,然后通过上面的公式代入x和y的值来算出码点。(类似于2字节编码的那部分UTF-8)

  • Code points in the range ‘\u0800‘ to ‘\uFFFF‘ are represented by 3 bytes xy, and z :

  翻译: ‘\u0800‘ to ‘\uFFFF‘ 用三字节编码,用x、y、z三字节来编码。

  • Characters with code points above U+FFFF (so-called supplementary characters) are represented by separately encoding the two surrogate code units of their UTF-16 representation. Each of the surrogate code units is represented by three bytes. This means supplementary characters are represented by six bytes, uvwxy, and z :

The bytes of multibyte characters are stored in the class file in big-endian (high byte first) order.

There are two differences between this format and the "standard" UTF-8 format. First, the null character (char)0 is encoded using the 2-byte format rather than the 1-byte format, so that modified UTF-8 strings never have embedded nulls. Second, only the 1-byte, 2-byte, and 3-byte formats of standard UTF-8 are used. The Java Virtual Machine does not recognize the four-byte format of standard UTF-8; it uses its own two-times-three-byte format instead.

For more information regarding the standard UTF-8 format, see Section 3.9 Unicode Encoding Forms of The Unicode Standard, Version 6.0.0.

翻译:6字节编码?多字符的字节存储在class文件中,大端序。

该编码和标准utf-8有两个差别。第一,空字符0用了2字节编码而不是1字节,因此修改后的UTF8字符串没有null值。第二,标准utf8中1,2,3字节格式的编码被支持。java虚拟机不识别4字节的编码;因此使用了6字节格式代替。

4.4.8. The CONSTANT_MethodHandle_info Structure

The CONSTANT_MethodHandle_info structure is used to represent a method handle:

The items of the CONSTANT_MethodHandle_info structure are the following:

tag

The tag item of the CONSTANT_MethodHandle_info structure has the value CONSTANT_MethodHandle(15).

值为CONSTANT_MethodHandle

reference_kind

The value of the reference_kind item must be in the range 1 to 9. The value denotes the kind of this method handle, which characterizes its bytecode behavior (§5.4.3.5).

值必须为1-9.它的值标识了这个方法处理的类型?

reference_index

The value of the reference_index item must be a valid index into the constant_pool table. Theconstant_pool entry at that index must be as follows:

  • If the value of the reference_kind item is 1 (REF_getField), 2 (REF_getStatic), 3 (REF_putField), or 4 (REF_putStatic), then the constant_pool entry at that index must be aCONSTANT_Fieldref_info (§4.4.2) structure representing a field for which a method handle is to be created.
  • If the value of the reference_kind item is 5 (REF_invokeVirtual) or 8 (REF_newInvokeSpecial), then the constant_pool entry at that index must be a CONSTANT_Methodref_info structure (§4.4.2) representing a class‘s method or constructor (§2.9) for which a method handle is to be created.
  • If the value of the reference_kind item is 6 (REF_invokeStatic) or 7 (REF_invokeSpecial), then if the class file version number is less than 52.0, the constant_pool entry at that index must be aCONSTANT_Methodref_info structure representing a class‘s method for which a method handle is to be created; if the class file version number is 52.0 or above, the constant_pool entry at that index must be either a CONSTANT_Methodref_info structure or aCONSTANT_InterfaceMethodref_info structure (§4.4.2) representing a class‘s or interface‘s method for which a method handle is to be created.
  • If the value of the reference_kind item is 9 (REF_invokeInterface), then the constant_pool entry at that index must be a CONSTANT_InterfaceMethodref_info structure representing an interface‘s method for which a method handle is to be created.

If the value of the reference_kind item is 5 (REF_invokeVirtual), 6 (REF_invokeStatic), 7 (REF_invokeSpecial), or 9 (REF_invokeInterface), the name of the method represented by a CONSTANT_Methodref_info structure or a CONSTANT_InterfaceMethodref_info structure must not be <init> or <clinit>.

If the value is 8 (REF_newInvokeSpecial), the name of the method represented by a CONSTANT_Methodref_info structure must be <init>.

   翻译:reference_index 值必须是有效索引。指向的值可以是如下:

    如果reference_kind 是1(REF_getField), 2 (REF_getStatic), 3 (REF_putField), or 4 (REF_putStatic), 那么值必须为CONSTANT_Fieldref_info,代表一个将要为方法handle创建的域

    如果 reference_kind item是 5 (REF_invokeVirtual) 或者8 (REF_newInvokeSpecial),那么值为CONSTANT_Methodref_info ,代表一个类的方法或者构造函数

      如果 reference_kind item 是6 (REF_invokeStatic) 或者7 (REF_invokeSpecial), 那么class文件的版本号小于52.0,值为CONSTANT_Methodref_info ,代表一个类的方法;如果版本号大于52,那么要么是一个CONSTANT_Methodref_info ,要么                                       是aCONSTANT_InterfaceMethodref_info ,代表一个类或者接口的方法。

如果 reference_kind item 是9 (REF_invokeInterface),那么值须为CONSTANT_InterfaceMethodref_info ,标识一个接口的方法。

4.4.9. The CONSTANT_MethodType_info Structure

The CONSTANT_MethodType_info structure is used to represent a method type:

代表一个方法类型

The items of the CONSTANT_MethodType_info structure are as follows:

tag

The tag item of the CONSTANT_MethodType_info structure has the value CONSTANT_MethodType (16).

descriptor_index

The value of the descriptor_index item must be a valid index into the constant_pool table. The constant_pool entry at that index must be a CONSTANT_Utf8_info structure (§4.4.7) representing a method descriptor (§4.3.3).

翻译:值须指向CONSTANT_Utf8_info,标识一个方法描述符

4.4.10. The CONSTANT_InvokeDynamic_info Structure

The CONSTANT_InvokeDynamic_info structure is used by an invokedynamic instruction (§invokedynamic) to specify a bootstrap method, the dynamic invocation name, the argument and return types of the call, and optionally, a sequence of additional constants called static arguments to the bootstrap method.

翻译:被invokedynamic 使用,指定一个启动方法,或者动态调用名,参数和返回类型,静态参数(可选)

The items of the CONSTANT_InvokeDynamic_info structure are as follows:

tag

The tag item of the CONSTANT_InvokeDynamic_info structure has the value CONSTANT_InvokeDynamic(18).

bootstrap_method_attr_index

The value of the bootstrap_method_attr_index item must be a valid index into the bootstrap_methods array of the bootstrap method table (§4.7.23) of this class file.

须为本class文件中启动方法表的bootstrap_methods数组 中有效索引

name_and_type_index

The value of the name_and_type_index item must be a valid index into the constant_pool table. Theconstant_pool entry at that index must be a CONSTANT_NameAndType_info structure (§4.4.6) representing a method name and method descriptor (§4.3.3).

必须为CONSTANT_NameAndType_info 类型,代表一个方法名和方法描述符

时间: 2024-09-30 11:10:07

翻译:JVM虚拟机规范1.7中的运行时常量池部分(三)的相关文章

JVM【第七回】:【OutOfMemoryError异常之运行时常量池溢出】

如果要向运行时常量池中添加内容,最简单的做法就是使用String.intern()这个Native方法.该方法的作用是:如果池中已经包含一个等于此String对象的字符串,则返回代表池中这个字符串的String对象:否则将此String对象包含的字符串添加到常量池中,并且返回此String对象的引用.由于常量池分配在方法区内,我们可以通过-XX:PermSize和-XX:MaxPermSize限制方法区的大小,从而间接限制其中产量池的容量:代码如下: package oom; import ja

JVM笔记3-java内存区域之运行时常量池

1.运行时常量池属于线程共享区中的方法区. 2.运行时常量池用于编译期生成的各种自变量,符号引用,这部分内用将在类加载后接入方法区的运行时常量池中存放. 看如下代码所示,如图: public class Test { public static void main(String[] args) { String s1 = "abc"; String s2 = "abc"; String s3 = new String("abc"); System

Java虚拟机OOM之运行时常量池溢出(5)

如果要向运行时常量池中添加内容,最简单的做法就是使用 String.intern()这个 Native 方法.该方法的作用是:如果池中已经包含一个等于此 String 对象的字符串,则返回代表池中这个字符串的String 对象:否则,将此 String 对象包含的字符串添加到常量池中,并且返回此 String 对象的引用.由于常量池分配在方法区内,我们可以通过-XX:PermSize 和-XX:MaxPermSize 限制方法区的大小,从而间接限制其中常量池的容量代码运行时常量池导致的内存溢出异

JVM 常量池、运行时常量池、字符串常量池

常量池: 即class文件常量池,是class文件的一部分,用于保存编译时确定的数据. 保存的内容如下图: 1 D:\java\test\out\production\test>javap -verbose mainTest 2 Classfile /D:/java/test/out/production/test/mainTest.class 3 Last modified 2019年4月22日; size 507 bytes 4 MD5 checksum 08699c6d713bc8967a

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

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

虚拟机中的运行时栈帧

每个人都知道,各种各样的动画视频,都是由一帧一帧图片连续切换结果的结果而产生的,其实虚拟机的运行和动画也类似,每个在虚拟机中运行的程序也是由许多的帧的切换产生的结果,只是这些帧里面存放的是方法的局部变量,操作数栈,动态链接,方法返回地址和一些额外的附加信息组成,在虚拟机中包含这些信息的帧称为"栈帧",每个方法的执行,在虚拟机中都是对应的栈帧在虚拟机栈中的入栈到出栈的过程.其中比较重要的一点时,如果虚拟机中同时有多个线程在执行,那么各个线程的栈帧都是相互独立,互不侵犯的,所以这也实现了局

Java中的String与常量池

string是java中的字符串.String类是不可变的,对String类的任何改变,都是返回一个新的String类对象.下面介绍java中的String与常量池. 1. 首先String不属于8种基本数据类型,String是一个类类型. 因为对象的默认值是null,所以String的默认值也是null:但它又是一种特殊的对象,有其它对象没有的一些特性. 2. new String()和new String(“”)都是申明一个新的空字符串,是空串不是null: 3. String str=”k

Java中的String与常量池[转帖]

string是java中的字符串.String类是不可变的,对String类的任何改变,都是返回一个新的String类对象.下面介绍java中的String与常量池. 1. 首先String不属于8种基本数据类型,String是一个对象. 因为对象的默认值是null,所以String的默认值也是null:但它又是一种特殊的对象,有其它对象没有的一些特性. 2. new String()和new String("")都是申明一个新的空字符串,是空串不是null: 3. String st

VDI环境中防护恶意软件时需要注意的三个方面

在VDI环境中,管理员需要确保组织对恶意软件的防护,但是这个过程并不包含可能会引起问题的杀毒软件. 对于虚拟桌面基础设施(VDI)中的恶意软件防护问题,目前还没有被大家普遍接受的标准.每个VDI供应商都使用自己的方式来实施防护计划,所以现在VDI环境中还没有明确的.详细的教程来讲解如何部署恶意软件防护方案.但是,总体来说有三个方面需要进行防护——VDI服务器.虚拟桌面镜像和用户配置文件夹. VDI服务器防护 在大多数情况下,你都可以使用保护其他服务器的方法和技术来保护VDI服务器.然而,这个准则