熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

解析JVM和JIT診斷技術的用法

2013-11-23 19:26:45  來源: Java核心技術 
    在任何給定的時刻JVM進程包含一些可執行文件和一些使用JIT編譯的代碼它們被動態鏈接到JVM中的MMI方法的封裝程序上JIT編譯的本地機器代碼被放置到JVM本地數據內存段中這樣就可以增加JVM進程的本地內存占用並且MMI封裝程序被修改為指向編譯後的代碼
    JIT診斷
    本節將介紹在問題發生時用來調試和診斷IBM JVM的JIT和MMI的技術上一節簡要介紹了JIT它是IBM JVM的一個基本部分
    在任何給定的時刻JVM進程包含一些可執行文件和一些使用JIT編譯的代碼它們被動態鏈接到JVM中的MMI方法的封裝程序上JIT編譯的本地機器代碼被放置到JVM本地數據內存段中這樣就可以增加JVM進程的本地內存占用並且MMI封裝程序被修改為指向編譯後的代碼
    因此JIT對於Java程序的執行流程會產生很大的影響
    ◆在將程序從一個平台上遷移到另外一個平台上碰到的問題如下
    死鎖掛起
    一直產生不正確的結果
    結果不一致
    不正常結束
    無限循環
    內存洩漏
    對問題原因要考慮的第一件事情是JIT
    盡快在判斷問題原因時確定JIT是否是問題的根源非常重要這是由於個原因
    ◆問題可能是由於JIT在JVM中給定的活動角色而引起的
    ◆JIT調試與其他類型的問題判斷技術有很大的不同
    ◆JIT調試過程可能會非常耗費時間而且非常復雜通常需要高級的專門技術
    確定是否是JIT問題
    在某些情況下從問題的特性可以很清楚地看出就是JIT的問題例如在JVM終止時帶有Javadump(在Linux上Javadump的文件名的格式為javacoreYYYYMMDDHHMMSSPIDtxt)或Linuxcore文件的情況下從Javadump中的跟蹤信息或gdb對Java可執行文件和core文件的輸出信息中可以很清楚地判斷出JIT就是產生問題的原因在某些情況下會直接顯示導致JVM進程死亡的信號是在libjitcso中接收到的在另外一些情況下在JVM進程的代碼中但是在該進程的已編譯代碼之外會產生崩潰或掛起這可以說明問題是由於JIT編譯的代碼產生的
    然而在大部分情況下並沒有清晰的跡象表明JIT是否是問題的源頭因此給定JIT的重要性後在問題判斷過程中的第一個步驟應該是禁用JIT除非這顯然不是一個與JIT相關的問題即使在有跡象表明JIT就是問題的原因的情況下最好也通過禁用JIT進行一下驗證並重新運行一下禁用了JIT的程序
    要禁用JIT首先請檢查一下當前環境變量JAVA_COMPILER的設置然後將其設置為NONE例如對於BourneAgainShell(bash)或Kornshell(ksh)設置如下exportJAVA_COMPILER=NONE
    對於csh設置如下
    setenvJAVA_COMPILERNONE   另外一種禁用JIT的方法是向java命令傳遞D參數將piler設置為NONE從而覆蓋默認的環境變量置
    piler=NONE<myapp>  JIT默認是被啟用的要驗證JIT是否被啟用了可以使用java命令的version選項javaversion
    如果沒有啟用JIT就會顯示一個包含如下內容的消息
    JITdisabled   如果啟用了JIT就會顯示一個包含如下內容的消息
    JITenabled:jitc   如果指定了JAVA_COMPILER=或piler=那就禁用了JIT如果JAVA_COMPILER沒有設置如下
    unsetJAVA_COMPILER   那麼JIT編譯器就啟用了
    再次運行一下程序看一下禁用JIT之後問題是否重現如果問題可以重現那麼這就不是一個與JIT有關的問題如果在禁用JIT之後問題就不存在了那麼這就可能是一個與JIT有關的問題在禁用JIT之後問題就不再出現的現象並不意味著JIT編譯器就是問題的原因例如高度線程化且時間相關的程序中的方法在編譯後和解釋時的運行速度可能會不同因此Java代碼中的邏輯錯誤只會在編譯代碼之後才會出現
    要啟用JIT請將JAVA_COMPILER設置為jitc或者使用下面的命令行來切換JIT編譯器
    piler=jitc<myapp>  或者取消JAVA_COMPILER環境變量的設置或者從傳遞給java命令的選項中刪除piler選項
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26875.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.