JVM学习笔记
在程序用也有28效应,也就是20%的代码占用了80%的时间。
方法调用会使优化器的有效性降低,因为优化器在不同的方法调用间不能有效的工作,因此优化器在方法调用的时候就无法专注于代码了。方法调用的频率越高,方法间可以用来优化的代码就越少,优化器就会越低效。
ClassFile表中各项的含义如下:
- magic【u4】:0xCAFEBABE,用于辨别是不是Java class文件。
- minor_version【u2】:主版本号。
- major_version【u2】:次版本号。
- constant_pool_count【u2】:常量个数。
- constant_pool【cp_info】:常量池。
- access_flags【u2】:文件中定义的类或接口的类型。
- this_class【u2】:指向常量池中的一项:CONSTANT_Class+name_index(全限定名在常量池中的位置)。
- super_class【u2】:除了Object外,其他的该属性都是有效,常量池中保存超累全限定名。
- interfaces_count【u2】:父接口的数目。
- interfaces【u2】:父接口在常量池中索引。
- fields_count【u2】:类变量+实力变量的数目。
- fields【field_info】:被编译器加上去的字段用Synthetic属性标识。
- methods_count【u2】:声明的所有方法总数。
- methods【method_info】:包含方法信息的列表。
- attributes_count【u2】:类属性的数目。
- attributes【attribute_info】:常量池索引。
常量池中容纳的符号引用包含三种特殊的字符串:全限定名、简单名称和描述符。当常量池入口指向类或接口时,它们给出该类或者接口的全限定名。字段名和方法名以简单名称形式出现在常量池入口中。字段的描述符给出了字段的类型,方法的描述符给出了方法的返回值和方法参数的数量、类型以及顺序。
字段和方法的描述符由如下所示的上下文无关语法定义:
常量池是一个长度可变的cp_info(tag【u1】+info【un】)表的有序序列。tag的类型如下:
- CONSTANT_Utf8_info【UTF-8格式的变体来存储一个常量字符串】,包括:tag+length+bytes;
- CONSTANT_Integer_info【常量int类型值】;
- CONSTANT_Float_info【常量float类型值】;
- CONSTANT_Long_info【常量long类型值】;
- CONSTANT_Double_info【常量double类型值】;
- CONSTANT_Class_info【引用的类或者接口】,包括:tag+name_index;
- CONSTANT_String_info【文字字符串】,包括:tag+string_index;
- CONSTANT_Fieldref_info【字段的符号引用】,包括:tag+class_index+name_and_type_index;
- CONSTANT_Methodref_info【类中方法】,包括:tag+class_index+name_and_type_index;
- CONSTANT_InterfaceMethodref_info【接口中方法】,包括:tag+class_index+name_and_type_index;
- CONSTANT_NameAndType_info【描述构成字段或方法的符号引用中的一部分,提供了所引用字段或者方法的简单名称和描述符的常量池入口】,包括:tag+name_index+descripter_index;
在类或接口中声明的每一个字段都由class文件中的一个名为field_info的可变长表进行描述。field_info表的结构为:access_flags【2】+name_index【2】+descriptor_index【2】+attributes_count【2】+attributes【attributes_count】。
在class文件中,每个在类或接口中声明的方法,或者是有编译器产生的方法,都由可变长度的method_info表来描述。method_info表的格式为:access_flags【2】+name_index【2】+descriptor_index【2】+attributes_count【2】+attributes【attributes_count】。