有誰知道爲什麼JSR/RET字節碼對在Java 6中不推薦使用?爲什麼JSR/RET棄用Java字節碼?
我在網上發現的唯一有意義的解釋是,他們通過運行時進行代碼分析變得越來越難以執行。有誰知道另一個原因?
有誰知道爲什麼JSR/RET字節碼對在Java 6中不推薦使用?爲什麼JSR/RET棄用Java字節碼?
我在網上發現的唯一有意義的解釋是,他們通過運行時進行代碼分析變得越來越難以執行。有誰知道另一個原因?
JSR和RET使字節碼驗證比其它方式可能由於放鬆一些正常的字節碼約束(例如在進入JSR時具有一致的堆棧形狀)而導致的難度要大得多。優點是很小(在某些情況下可能略小一些),驗證者在處理奇怪的JSR/RET模式(以及潛在的安全漏洞,以及相關的運行時全面驗證成本)方面的困難使其成爲無用的功能繼續擁有。
堆棧映射和由數據啓用的輕量級驗證程序在類加載過程中獲得了巨大的性能優勢,無需犧牲安全性。
備案:安全漏洞不僅具有潛力,而且舊Java版本中存在驗證錯誤,其中使用SWAP字節碼交換堆棧上的兩個返回地址(JSR/JSR/SWAP/RET漏洞)導致類型混淆。 – mihi 2011-11-08 23:12:06
進入時具有一致的堆疊形狀意味着什麼? – KodeWarrior 2017-03-09 09:07:46
JVM使用堆棧來表示操作的操作數。例如:iadd字節碼需要堆棧中的2個整數,然後將這些整數加到一起。因此,要形成一個一致的形狀,就意味着在方法中的任何給定的字節碼位置,堆棧總是具有相同的深度,並且堆棧中的每個元素都是正確的類型(例如:int vs reference等)。 – 2017-03-10 04:55:49
您的意思是不被JVM所棄用,或者不再被Oracle的Java編譯器使用?我無法在JVMS上找到棄用通知7 https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.jsr – 2015-04-30 20:32:26