色婷婷狠狠18禁久久YY,CHINESE性内射高清国产,国产女人18毛片水真多1,国产AV在线观看

Java8下如何查看JVM里Java應用的字節碼?

老白2年前14瀏覽0評論

作者:RednaxelaFX鏈接:https://www.zhihu.com/question/51423993/answer/125869628來源:知乎著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

您找到的運行時字節碼看起來跟原本的字節碼挺吻合的啊。您找的地方就對了。OracleJDK8/OpenJDK8的HotSpotVM還是把字節碼放在ConstMethod對象的末尾的。

例如說,fn()的第一條字節碼,在Class文件的里的放左邊,運行時您找到的放右邊:這個"0xCA"opcode是breakpoint,說明您在fn()的入口處放了個Java層面的斷點。然后dup(0x59)后面那條指令:原本的指令是ldc(0x12),改寫后的指令是HotSpotVM解釋器的內部字節碼指令_fast_aldc(0xE5),內容也是完全對應的。緊接著后面的一條:

這個是您眼花了,運行時改寫后的字節碼還是0x06(您把它看成了0x0B而已).

有些字節碼指令的操作數在Class文件里跟在運行時看起來不同,是因為HotSpotVM在加載類的時候會對字節碼做改寫,把某些指令的操作數從常量池下標(constantpoolindex)改寫為常量池緩存下標(constantpoolcacheindex)。這是因為這些指令所需要引用的信息比一個constantpoolentryslot要大,需要另外開一個更大的數據結構來放該常量池項的內容。