『壹』 如何檢查內存泄露問題
一、內存泄漏的檢查方法:
1.ccmalloc-Linux和Solaris下對C和C++程序的簡單的使用內存泄漏和malloc調試庫。
2.Dmalloc-Debug Malloc Library.
3.Electric Fence-Linux分發版中由Bruce Perens編寫的malloc()調試庫。
4.Leaky-Linux下檢測內存泄漏的程序。
5.LeakTracer-Linux、Solaris和HP-UX下跟蹤和分析C++程序中的內存泄漏。
6.MEMWATCH-由Johan Lindh編寫,是一個開放源代碼C語言內存錯誤檢測工具,主要是通過gcc的precessor來進行。
7.Valgrind-Debugging and profiling Linux programs, aiming at programs written in C and C++.
8.KCachegrind-A visualization tool for the profiling data generated by Cachegrind and Calltree.
9.IBM Rational PurifyPlus-幫助開發人員查明C/C++、託管。NET、Java和VB6代碼中的性能和可靠性錯誤。PurifyPlus 將內存錯誤和泄漏檢測、應用程序性能描述、代碼覆蓋分析等功能組合在一個單一、完整的工具包中。
二、內存泄漏的簡單介紹:
內存泄漏也稱作「存儲滲漏」,用動態存儲分配函數動態開辟的空間,在使用完畢後未釋放,結果導致一直占據該內存單元。直到程序結束。(其實說白了就是該內存空間使用完畢之後未回收)即所謂內存泄漏。
內存泄漏形象的比喻是「操作系統可提供給所有進程的存儲空間正在被某個進程榨乾」,最終結果是程序運行時間越長,佔用存儲空間越來越多,最終用盡全部存儲空間,整個系統崩潰。所以「內存泄漏」是從操作系統的角度來看的。這里的存儲空間並不是指物理內存,而是指虛擬內存大小,這個虛擬內存大小取決於磁碟交換區設定的大小。由程序申請的一塊內存,如果沒有任何一個指針指向它,那麼這塊內存就泄漏了。
『貳』 如何排查java應用內存泄漏問題
排查Java應用內存泄漏問題的方法包括三種典型場景:堆內OOM、MetaSpace區OOM以及堆外內存OOM。
首先,處理堆內OOM問題時,藉助arthas工具能簡便定位問題。通過arthas容器運行命令,進入dashboard查看堆內存佔比,進行heapmp操作並使用jvisualvm工具分析導出的pdjf文件,從而識別出出現問題的對象,反查代碼迅速解決問題。
其次,針對MetaSpace區OOM問題,分析其原因主要是代碼中大量使用反射生成動態類或類載入器不停載入新類導致內存持續增長無法釋放。處理策略包括利用JProfiler或MAT觀察類Histogram,通過jcmd命令查看類載入和卸載詳細信息,從整體或具體包類載入情況定位問題。確保Class載入和卸載過程無誤,避免內存泄漏。
處理堆外內存OOM問題,主要關注內存使用率上升、使用SWAP內存、GC時間飆升、線程被阻塞等現象。此類問題可能由主動申請未釋放的堆外內存或JNI調用導致的Native Code申請內存未釋放引起。使用NMT(NativeMemoryTracking)分析內存分布,通過命令jcmd查看總分配內存與RES大小差異,區分主動申請未釋放或JNI調用導致的內存泄漏。調整參數如-Xmx、-XX:MaxDirectMemorySize限制堆外內存大小,並檢查代碼中NIO、Netty組件計數器與最大值限制,確保正確釋放內存。使用Debug工具確認代碼邏輯正確性。
配置OOM時,輸出GC日誌列印及自動mp文件,幫助問題排查。在發生Out Of Memory錯誤時,JVM將heapmp文件輸出到指定目錄,文件名唯一,避免覆蓋問題。注意輸出大文件可能影響IO性能,尤其是容器環境下可能影響宿主機其他容器。同時,GC日誌的輸出也對排查GC問題至關重要,對系統性能影響不大。