2010-09-16 51 views
15

我想在調試模式下釋放Java應用程序,以便在客戶端發生隨機或難以重現的問題時更容易進行調試。在調試模式下運行JVM的副作用

但是,我想要弄清楚這樣做的潛在副作用嗎?從Java HotSpot文檔中,似乎有should be no performance penalty

從鏈接

全速調試

雖然Java HotSpot VM現在使用 全速調試。在之前版本的虛擬機 中,調試時啓用了 ,程序僅執行使用 的解釋器。現在,即使具有編譯代碼,程序 也可使用HotSpot 技術的全部 性能優勢。改進的性能允許長期運行的 程序更容易調試。 它也允許全速測試 。一旦出現異常,調試器將以 對代碼源的完全可見性啓動。

這是準確的還是有隱藏的警告,內存佔用情況如何以及使用調試模式時是否還有其他隱藏的陷阱。

PS:我發現來自AMD的this article,這證實了我最初的懷疑,即來自oricale的原始文章沒有顯示完整的故事。

+0

你在Java HotSpot網站上讀到了什麼,導致你得出結論:不應該有懲罰? – linuxuser27 2010-09-16 00:28:28

+0

來自另一個鏈接「全速調試 Java HotSpot虛擬機現在使用全速調試,在以前版本的虛擬機中,啓用調試時,程序僅使用解釋器執行,現在,HotSpot技術的全部性能優勢即使在編譯代碼的情況下,程序也可以使用它,改進後的性能使得長時間運行的程序可以更容易地進行調試,並且可以讓測試全速進行,一旦出現異常,調試器就會啓動並完全可見代碼源。 「 – hhafez 2010-09-16 00:33:20

+0

AMD文章消失了。 :( – 2017-12-06 09:28:41

回答

14

我不能爲HotSpot說話,也不會爲IBM正式發言,但我會說有一些合法的優化方法,如果在它們中間需要反彙編,那麼它們是無法完全撤消的,因此在您可能使用的生產JVM中要求調試時未啓用。

想象一下,優化程序發現程序的一部分可能不是必需的,並且通過各種語言規則(包括JSR 133)合法刪除,JVM將希望擺脫它。一個問題就是調試:刪除代碼對於人類跨過它來說看起來很奇怪(變量沒有更新,在步進時可能不會在行上停止),所以選擇在這些情況下禁用所述優化。對於堆棧分配對象等opts也是如此。因此,雖然JVM表示它是「全速」,但它實際上更接近「幾乎全速,其中一些更好用的opts不能完全撤銷」 。

+1

你可以強制在非調試模式下禁用優化或在調試模式下強制優化相反,所以我們在兩種模式下都有同等行爲嗎? – hhafez 2010-09-24 00:57:15

+0

對不起,我不知道HotSpot的答案。在J9中看到,沒有支持禁用某些opts的方法(或者確切的列表是什麼)。不,你不能在調試模式下啓用不安全的方式 - 當非法狀態被擊中時,JVM將簡單地熄滅你,我們不想這麼做! 2010-09-24 13:01:08

2

如果您計劃在啓用遠程調試的情況下運行應用程序,它也會影響安​​全性。通過遠程調試,您的計算機上可以打開一個端口,通過連接它,我可以爲您的應用程序做各種有趣的事情。

+0

如果你進行遠程調試,這是真的,否則情況並非如此 – hhafez 2010-09-28 08:13:06

+1

@hhafez Yup,這就是爲什麼我寫了「如果你打算在啓用遠程調試的情況下運行應用程序」:) – Hila 2010-09-28 09:01:16

1

在調試模式下,程序肯定比單純運行要多得多,所以顯然性能不可能一樣。但是,如果您仔細閱讀該說明,則說明新版本可以運行完全優化的代碼,即使在以前不可能的調試模式下也是如此。因此,新的jvm比以前只能運行在沒有優化的解釋模式下的jvm要快得多。

相關問題