JVM(和Spark)性能優化:使用Java Mission Control (1)
在大數據分析或其它業務處理中,你是否碰到過作業停滯、卡住等響應性問題呢?或者每隔1~2小時就有7~8秒的停頓時間而你的機器有48 cores和128GB RAM呢?或者內存占用過大(也不確定是否有內存泄露),甚至碰到過如下錯誤呢?

–‘Out of Memory’ (OOM)
– ‘Error: Java Heap Space’
– ‘GC overhead limit exceeded’
Java有許多排錯、性能分析、監控和管理工具(Troubleshooting, Profiling, Monitoring and Management Tools),可以讓應用程序運行得飛快且穩定。包括:
Jcmd – JVM診斷(Diagnostic)命令工具
Jconsole – JMX兼容的圖形工具監控Java應用程序
Jvisiualvm – 提供應用程序的細節信息。有CPU & 內存性能,堆轉儲分析,內存泄漏檢測等
Jmc(Java Mission Control) – 監控和管理應用程序的工具并且沒有性能開銷(小于1%)。10年前最常見的性能優化工具Test and Performance Tools Platform (TPTP) ,啟動后應用程序都跑不動,使用非常痛苦。JMC應該是現在每個Java專家和性能架構師都應該掌握的新工具和方法!邁向基于“性能數據驅動的開發”。
還有其它一些小工具
監控工具:
Jps – JVM進程狀態工具
Jstat – JVM統計監控工具
排錯工具:
Jmap - Java內存映射
Jhat – 堆轉儲瀏覽器
Jstack – Java堆棧跟蹤
Java Mission Control(JMC)是什么呢?
是一組功能強大的工具集運行于Oracle JDK上,用來監控和管理Java應用程序。
開發時可免費使用(Oracle Binary Code License),但在生產環境需要購買。
支持插件;目前集成有兩種工具:JMX控制臺和Java 飛行記錄器。
在$JAVA_HOME/bin運行jmc命令啟動。可以運行于Eclipse。
在JDK 7u40+和JDK 8中,自帶了個新的監控和診斷工具Java Mission Control(JMC),它功能強大,全新的圖形界面能清晰地監控和診斷Java虛擬機的方方面面,尤其是JMC中的Java Flight Record(Java 飛行記錄器JFR),也是本文重點介紹的。
使用Java Discovery Protocol (JDP)來瀏覽JVM。允許列出本地或遠程運行的Java程序并連接它們。提供了加密通信。
一種工具,通過JMX接口監控和管理多個Oracle JVM實例。可以捕獲和表示實時數據(live data),包括:
垃圾收集(GC)暫停
內存(堆使用)
其它通過MBean暴露的屬性
Java 飛行記錄器 (JFR) ,類似于飛機上的黑匣子。是一個用于收集有關正在運行的 Java 應用程序的診斷數據和概要分析數據的工具。它集成到 Java 虛擬機 (JVM) 中,幾乎不會帶來性能開銷,因此甚至可以在高負載生產環境中使用。使用默認設置時,內部測試和客戶反饋表明性能影響低于 1%。對于一些應用程序,這一數字會大幅降低。但是,對于短時間運行的應用程序 (不是在生產環境中運行的應用程序類型),相對的啟動和預熱時間可能會較長,這對性能的影響可能會超過 1%。JFR 收集有關 JVM 及其上運行的 Java 應用程序的數據。
與其他類似工具相比,JFR 具有以下優勢:
提供更好的數據:JFR 使用的相關數據模型使其易于交叉引用和過濾事件。
允許使用第三方事件提供程序:JFR 通過一組 API 監視第三方應用程序,包括 WebLogic Server 和其他 Oracle 產品。
降低總體成本:使用 JFR 可以縮短在診斷問題和排除問題方面所花的時間、減少運營成本和業務中斷、在出現問題時能夠更快地予以解決,并且可以提高系統效率。
JFR 主要用于:
概要分析
JFR 連續保存有關正在運行的系統的大量數據。此概要分析信息包括線程樣本 (其中顯示程序在什么地方占用了時間)、鎖概要文件以及垃圾收集詳細信息。
黑匣子分析
JFR 將信息連續保存到循環緩沖區。可在檢測到異常時評估此信息以查找原因。
本文使用的是JMC 5.4,集成在JDK 7u75和8u20中。JMC 5.5將集成在8U40中,6.0正在開發中,預計集成在JDK 9中。
JFR 從 JVM (通過內部 API) 和 Java 應用程序 (通過 JFR API) 收 集數據。此數據存儲在小型線程本地的緩沖區中,這些緩沖區會刷新到內存中的全局緩沖區。接下來,內存中的全局緩沖區內的數據將寫入到磁盤。磁盤寫入操作開 銷很高,因此應該仔細選擇需要啟用記錄的事件數據,盡可能地減少寫入操作。二進制格式的記錄文件非常緊湊,應用程序可以高效地讀取和寫入。
不同緩沖區之間沒有信息重疊。具體數據塊將只在內存或磁盤上可用,但永遠不會同時在兩處可用。這樣會有以下隱患:
· 在出現電源故障后,尚未刷新到磁盤緩沖區的數據將不可用。
· JVM 崩潰會導致一些數據在核心文件中 (即內存中緩沖區),而另一些數據在磁盤緩沖區中。JFR 不提供合并這些緩沖區的功能。
· JFR 收集的數據在對您可用之前,可能略有延遲 (例如,數據需要移動到其他緩沖區才能變得可見時)。
· 記錄文件中的數據可能未按時間順序排列,因為數據是從多個線程緩沖區以數據塊的形式收集的。
在某些情況下,JVM 會丟棄事件順序以確保不會崩潰。任何無法快速寫入磁盤的數據將會放棄。發生這種情況時,記錄文件中將包含受影響時段的相關信息。此信息也會記錄到 JVM 的日志記錄工具中。
您可以配置 JFR 以 便不將任何數據寫入磁盤。在此模式中,全局緩沖區起到了循環緩沖區的作用,在緩沖區變滿時刪除最早的數據。這種開銷極低的操作模式仍會收集問題根本原因分 析所需的全部關鍵數據。由于最近的數據始終在全局緩沖區中可用,只要操作或監視系統檢測到問題,這些數據可以根據需要寫入磁盤。但是,在這種模式下,只有 最近幾分鐘的數據可用,因此只包含最新的事件。如果需要獲取時間段較長的完整操作歷史記錄,請使用定期將數據寫入磁盤的默認模式。
沒有終止時間;必須顯式地轉儲(dump)成jfr文件,然后用JMC打開分析。
有固定時間;如果在JMC發起則會由JMC自動下載到本地并打開jfr文件分析。
JFR生成是的二進制的以.jfr結尾的磁盤文件,需要明確定制保存的路徑。
Java 飛行記錄器收集有關事件的數據。事件在 JVM 或 Java 應用程序中的特定時間點發生。每個事件都具有名稱、時間戳以及可選的有效負載。有效負載是與事件關聯的數據,例如 CPU 占用率、事件發生前后的 Java 堆大小、鎖所有者的線程 ID 等。
大部分事件還具備關于所發生事件的線程的信息、發生事件時的堆棧跟蹤以及事件的持續時間。使用事件中提供的信息,您可以重新構建 JVM 和 Java 應用程序的運行時詳細信息。
JFR 收集有關三種類型事件的信息:
· 持續時間事件在一段時間中發生,在事件完成時記錄。可以為持續時間事件設置閾值,這樣就只會記錄持續時間超過指定時段的事件。這不適用于其他類型的事件。
· 即時事件在瞬間發生并立即記錄。
· 采樣事件 (也稱為可請求事件) 會定期記錄,用于提供系統活動樣本。您可以配置采樣頻率。
JFR 在極高的明細級別上監視正在運行的系統。這會生成海量的數據。為了盡可能保持低開銷,需要將記錄的事件類型限制為您實際需要的類型。大部分情況下,持續時間非常短的事件沒有多大意義,因此,可以將記錄限制為持續時間超過特定有意義閾值的事件。
轉載請注明出處:華為云博客 https://portal.hwclouds.com/blogs
JVM spark Java
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。