2013-04-28 74 views
6

我聽到很多JVM JIT 可以做的事情,但沒有看到關於如何配置JIT實際上在給定的程序運行中實際執行的內容的很多信息。有很多關於使用-XX:+PrintCompilation-XX:+PrintOptoAssembly的提示,但它會導致很難解釋的真正低級別的信息。一般來說,在優化過程中,我喜歡使用專用JIT預熱時間等基準測試套件進行通用操作,但我希望能夠看到哪些優化實際上正在觸發我的代碼。也許我的JVM考慮內聯一個特定的方法調用,但是關於它的一些事情使它決定不要,或者也許JIT無法避免在我的循環中進行數組邊界檢查,因爲我的表達式不明確和循環條件太模糊。我期望像YourKit這樣的工具支持某種形式的「JIT發生了什麼」,但我一直無法在YourKit或其他任何地方找到對它的支持。JVM JIT診斷工具和優化技巧

理想情況下,我只是想在JIT的優化程序運行過程中想到的一個大腦轉儲。假設我已經預熱了我的功能,並且決定將三種方法內聯到我的內部循環中,並將循環分成三部分,在中間部分沒有數組邊界檢查,我希望總結這些決定和動機爲他們。

我在這裏錯過了一些明顯的東西嗎? JVM性能感知型編程人員在優化緊密內部循環以確定發生了什麼時會執行什麼操作?當然,低級-XX標誌不可能是唯一的選擇,他們可以嗎?我很高興提示如何在JVM上處理這種低級別的東西。不,這個問題不是過早優化的動機! :)

編輯:我想我想要的一些是-XX:+LogCompilation,但我仍然好奇人們是否有這種活動的一般技巧和工具。

+0

這個演講可能會給你一些關於如何可視化JVM內部的信息:http://www.infoq.com/presentations/Visualizing-Java-GC – sschaef 2013-04-28 02:29:02

回答

3

如果你想要一個大腦轉儲,你可以打印生成的彙編代碼,但這是低於你已經有的水平。我懷疑HotSpot JVM不存在您正在查找的內容。我看到基於JRockit的這種類似的演示文稿,也許這將在一天內將其轉化爲HotSpot。

我在這裏錯過了一些明顯的東西嗎? JVM性能感知型編程人員在優化緊密內部循環以確定發生了什麼時會執行什麼操作?

通常,我喜歡減少垃圾產生,這通常表現不錯。例如對於微秒的延遲。

這種微型優化確實需要深入理解機器代碼以及CPU如何工作。

當然,低級-XX標誌不能是唯一的選擇,他們可以嗎?

如果只有它那麼簡單,那就更加複雜了。要轉儲機器碼,您需要一個附加的本機庫,它不隨JVM提供。 ;)

我會很高興提示如何最好地處理這種類型的JVM上的低級別的東西。

看來你並不是真的想在低水平上工作,如果你能避免它,我相信這是一件好事,你必須首先照顧高水平,因爲微優化是好的對於微型基準測試而言,但對於真正的應用程序來說很少有用,因爲您需要了解端到端系統的所有延遲,而且在許多情況下甚至不需要查看代碼。即數據庫,操作系統,磁盤或網絡IO中的主要延遲。

如果人們有這種活動的一般技巧和工具,我仍然很好奇。

使用探查器,如果您懷疑您需要降低,很可能您錯過了更重要的事情。

+1

添加正確的庫實際上是你在Hotspot上獲取機器碼所需的全部信息。無需JVM的調試版本,默認的二進制文件就可以正常工作。 – Voo 2013-04-28 19:19:49

+0

@Voo自從我做到這一點以來已經有一段時間了。謝謝你的糾正。 – 2013-04-28 19:21:46

+1

我不認爲這可能會錯過更重要的事情。我主要感興趣的是像Scala這樣的高級語言如何與JVM的現有優化一起使用。特別是,令我感到沮喪的是,從Scala中獲得合理性能的唯一方法(針對面向用戶的功能進行大量數據處理,因此原始速度很重要)是下降到「while」循環等等。爲了改進它,我想試驗和設計更好的Scala抽象,但JIT工作得很好,爲此,一個好的JIT診斷工具是有幫助的。 – 2013-11-14 13:41:37