在程式用也有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】。