Java 堆轉(zhuǎn)儲(chǔ)包含如此多的信息,以至于識(shí)別 JVM 內(nèi)存泄漏的原因就像大海撈針一樣。而且,從生產(chǎn)系統(tǒng)中檢查 Java 堆轉(zhuǎn)儲(chǔ)可能會(huì)讓你在不知不覺中擁有個(gè)人身份信息,如果處理不當(dāng),可能會(huì)給你帶來各種隱私問題,這會(huì)使整個(gè)文件感覺具有放射性。對java感興趣的同學(xué)可以參加java培訓(xùn),可以獲得快速有效的學(xué)習(xí)。
檢查 Java 堆轉(zhuǎn)儲(chǔ)根本不值得麻煩,如果不是因?yàn)檫@樣做幾乎是修復(fù) JVM 中 Java 內(nèi)存泄漏的唯一方法。或者至少在 Java Flight Recorder 引入 Old Object Sample 事件之前,這是唯一的方法。
使用 Java Flight Recorder 進(jìn)行 JVM 堆分析
以下是 Java Flight Recorder 的 Old Object Sample 事件的工作原理。開始記錄時(shí),將跟蹤 Java 堆中固定數(shù)量的對象。Java 堆對象的跟蹤屬性包括:
對象的分配開始時(shí)間
對象的持續(xù)時(shí)間
關(guān)聯(lián)事件線程
最后已知的堆大小使用情況
對象類型
垃圾收集根
你可以通過調(diào)整舊對象隊(duì)列大小來調(diào)整 Flight Recorder 跟蹤的 Java 堆上的對象數(shù)量:
-XX:FlightRecordingOptions=old-object-queue-size=512
JDK Mission Control 內(nèi)存泄漏檢測
當(dāng) Java 堆上的跟蹤對象被垃圾回收時(shí),它會(huì)從樣本中刪除并添加一個(gè)新對象。隨著時(shí)間的推移,導(dǎo)致內(nèi)存泄漏的對象更有可能被跟蹤。JVM Flight Recorder 運(yùn)行的時(shí)間越長,就越有可能跟蹤導(dǎo)致內(nèi)存泄漏的對象。在java培訓(xùn)中,有很多關(guān)于JVM的培訓(xùn)課程,在專業(yè)老師的教學(xué)指導(dǎo)下,可以很全面地掌握J(rèn)MS的相關(guān)知識(shí)和技能。
此外,這些導(dǎo)致 Java 內(nèi)存泄漏的對象存在的時(shí)間越長,它們消耗的內(nèi)存越多,當(dāng)需要檢查 Java Mission Control 中的 JVM Flight Recording 時(shí),它們的存在就越明顯。
此外,Java Mission Control 中的規(guī)則引擎能夠識(shí)別哪些長時(shí)間運(yùn)行的 Java 堆對象最有可能導(dǎo)致 JVM 內(nèi)存泄漏。
請注意,在 Java Flight Recorder 在旨在觸發(fā)內(nèi)存泄漏的示例應(yīng)用程序上運(yùn)行后,Java Mission Control 立即指示通過舊對象示例事件監(jiān)視的對象可能是罪魁禍?zhǔn)祝?/span>
在錄制過程中,堆上的 live set 似乎以每秒 192 KiB 的速度增加。
對參考樹的分析發(fā)現(xiàn)了 1 個(gè)泄漏候選者。主要候選是 java.util.Hashtable$Entry[] 被這個(gè)鏈引用:
java.util.Hashtable.table
se.hirt.jmc.tutorial.memleak.Leak$DemoThread.table
Java 堆上的活動(dòng)對象
隨著初始自動(dòng)分析,Java Mission Control 將提供一個(gè)列表,指示堆上所有活動(dòng)項(xiàng)目的大小,以及內(nèi)存中所有活動(dòng)對象的列表。如你所見,無需借助 JVM 堆轉(zhuǎn)儲(chǔ),即可輕松識(shí)別 Java 內(nèi)存泄漏。想學(xué)習(xí)java技術(shù)的同學(xué),不妨報(bào)個(gè)Java培訓(xùn)班,有明確清晰的學(xué)習(xí)路線,理論知識(shí)+實(shí)戰(zhàn)操作,可以獲得快速提升。
內(nèi)存泄漏檢測最佳實(shí)踐
顯然,內(nèi)存泄漏檢測示例中的示例是一個(gè)簡單的示例。要在更復(fù)雜的示例中識(shí)別違規(guī)對象,請遵循以下內(nèi)存泄漏檢測最佳實(shí)踐:
長時(shí)間運(yùn)行 Java Flight Recorder。這增加了違規(guī)對象的變化以進(jìn)行采樣。查看在 JVM 上消耗最多內(nèi)存的對象。
查看在 JVM 上消耗最多內(nèi)存的對象。
取消在 JVM 啟動(dòng)時(shí)分配的對象的優(yōu)先級。進(jìn)程初始化會(huì)產(chǎn)生很多噪音。
在飛行記錄器運(yùn)行中間分配的對象比在開始或結(jié)束時(shí)分配的對象更可能是罪魁禍?zhǔn)住?/span>
監(jiān)視 Java 類加載器外部引用的守護(hù)線程。
密切關(guān)注:靜態(tài)變量、緩存數(shù)據(jù)、長時(shí)間運(yùn)行的線程。
添加自定義觸發(fā)器以在滿足某些內(nèi)存消耗閾值時(shí)啟動(dòng) Java Flight Recorder。
通過對自定義 Flight Recorder 事件進(jìn)行編碼并在潛在問題點(diǎn)啟動(dòng)它們,將遙測添加到你的 Java 應(yīng)用程序。
在內(nèi)存問題成為嚴(yán)重程度為 1 的生產(chǎn)問題之前,積極主動(dòng)地監(jiān)控應(yīng)用程序的內(nèi)存問題。
JVM Flight Recorder 和 JDK Mission Control
JVM Flight Recorder 和 JDK Mission Control 提供了多種高級功能,使開發(fā)人員無需檢查復(fù)雜的 Java 堆轉(zhuǎn)儲(chǔ)即可解決 Java 內(nèi)存泄漏問題。熟悉這些強(qiáng)大的分析和監(jiān)控工具,解決 Java 性能問題將不再是一項(xiàng)繁瑣的任務(wù)。參加java培訓(xùn),學(xué)習(xí)最新java技能,可以讓你的實(shí)力一直保持領(lǐng)先水平,提升行業(yè)競爭力。