首頁>技術>

使用Java語言開發應用程式,雖然JVM幫我們進行了GC收集、清除工作;但是使用不當的話,還是會導致某些物件常駐堆空間無法給垃圾收集器清除,導致記憶體洩露、記憶體溢位等情況,今天盤點一下在專案中進行記憶體洩露分析和GC分析的一些常用、好用的工具。

0x01:JDK自帶工具

在處理記憶體洩露方面JDK本身就自帶了大量監控、分析工具,主要有如下一些:

jps:可檢視當前系統執行的所有java程序jstat:檢視具體某個Java程序的GC情況jmap: 檢視某個Java程序的堆記憶體使用情況jvisualvm:視覺化檢視堆記憶體與metaspace佔用情況jstack:檢視具體某個java進行的執行緒堆疊情況

0x02:Eclipse Memory Analyzer

官網有如下一段英文介紹:

The Eclipse Memory Analyzer is a fast and feature-rich Java heap analyzer that helps you find memory leaks and reduce memory consumption.

Use the Memory Analyzer to analyze productive heap dumps with hundreds of millions of objects, quickly calculate the retained sizes of objects, see who is preventing the Garbage Collector from collecting objects, run a report to automatically extract leak suspects.

大致的意思如下:

Eclipse Memory Analyzer(簡稱MAT)是一個快速且功能豐富的Java堆分析器,可幫助您查詢記憶體洩漏並減少記憶體消耗。使用Memory Analyzer分析具有數億個物件的高效堆轉儲,快速計算物件的保留大小,檢視誰阻止垃圾收集器收集物件,執行報告以自動提取洩漏嫌疑者。

官網地址:https://www.eclipse.org/mat/

這款工具在分析記憶體洩露方面非常好用,可以圖形化展示透過jmap命令打印出來的記憶體快照,而且是免費的。

0x03:JProfiler

JProfiler 是一個商用的主要用於檢查和跟蹤系統(限於Java開發的)的效能的工具。JProfiler可以透過實時的監控系統的記憶體使用情況,隨時監視垃圾回收,執行緒執行狀況等手段,從而很好的監視JVM執行情況及其效能。專用於分析J2SE和J2EE應用程式。它把CPU、執行緒和記憶體的剖析組合在一個強大的應用中。JProfiler提供許多與IDE整合和應用伺服器整合的外掛。JProfiler視覺化的讓使用者可以找到效能瓶頸、抓出記憶體漏失(memory leaks)、並解決執行緒的問題。

0x04:Arthas

首先阿里出品必屬精品,Arthas當然也非常好用。

Arthas是一款阿里巴巴開源的 Java 線上診斷工具,功能非常強大,可以解決很多線上不方便解決的問題。Arthas診斷使用的是命令列互動模式,支援JDK6+,Linux、Mac、Windows 作業系統,命令還支援使用 tab 鍵對各種資訊的自動補全,診斷起來非常利索。

程式碼倉庫地址:https://github.com/alibaba/arthas
從官網可以知道Arthas有以下一些特徵檢查是否載入了類,或在哪裡載入了類。(對於解決jar檔案衝突很有用)反編譯一個類以確保程式碼按預期執行。檢視類載入器統計資訊,例如,類載入器的數量,每個類載入器載入的類的數量,類載入器的層次結構,可能的類載入器洩漏等。檢視方法呼叫詳細資訊,例如方法引數,返回物件,引發的異常等。檢查指定方法呼叫的堆疊跟蹤。當開發人員想知道所述方法的呼叫者時,這很有用。跟蹤方法呼叫以查詢慢速子呼叫。監視方法呼叫統計資訊,例如qps,rt,成功率等。監視系統指標,執行緒狀態和cpu使用情況,gc統計資訊等。支援命令列互動模式,並啟用了自動完成功能。支援telnet和websocket,可透過命令列和瀏覽器啟用本地和遠端診斷。支援分析器/火焰圖支援JDK 6+。支援Linux / Mac / Windows。

0x05:作業系統命令

無論怎麼說,作業系統本身的命令是基礎。透過Linux本身的一些命令也是可以對java進行一定程度的檢查與檢測的。不過根據不同的Linux版本,使用的命令可能存在一些差異,下面以CentOS為例說明:

free:檢視記憶體佔用、剩餘情況top:實時監控所有程序的記憶體、CPU、IO等情況lsof:該命令的功能很多,其中有一項功能可以檢視某個程序開啟的檔案控制代碼情況

Linux作業系統的命令非常多,涉及到記憶體、io、網路、磁碟等情況都可以找到相關命令來監控。具體場景再去查詢相關資料進行相關處理。

0x06:GCViewer

GCViewer是一款實用的GC日誌分析軟體,免費開源使用,不過需要先安裝jdk或者java環境才可以使用,因為它本身就是Java語言開發的。軟體為GC日誌分析人員提供了強有力的功能支援,大大提高分析GC日誌的效率。

官網地址:https://www.tagtraum.com/gcviewer.html

9
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • Service Mesh(服務網格)概念及Istio初體驗