初步判断内存泄漏方法
生活随笔
收集整理的這篇文章主要介紹了
初步判断内存泄漏方法
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
有時(shí)候,內(nèi)存泄漏不明顯,或者懷疑系統(tǒng)有內(nèi)存泄漏,我們可以通過下面介紹的方法初步確認(rèn)系統(tǒng)是否存在內(nèi)存泄漏。 首先在Java命令行中增加-verbose:gc參數(shù), 然后重新啟動java進(jìn)程。 當(dāng)系統(tǒng)運(yùn)行過程中,JVM進(jìn)行垃圾回收的時(shí)候,會將垃圾回收的日志打印出來,通過分析 這些GC日志,我們可以初步判斷系統(tǒng)是否存在堆內(nèi)存泄漏, 8190.813: [GC 164675K->251016K(1277056K), 0.0117749 secs] 8190.825: [Full GC 251016K->164654K(1277056K), 0.8142190 secs] 8191.644: [GC 164678K->251214K(1277248K), 0.0123627 secs] 8191.657: [Full GC 251214K->164661K(1277248K), 0.8135393 secs] 8192.478: [GC 164700K->251285K(1277376K), 0.0130357 secs] 8192.491: [Full GC 251285K->164670K(1277376K), 0.8118171 secs] 8193.311: [GC 164726K->251182K(1277568K), 0.0121369 secs] 8193.323 : [Full GC 251182K->164644K(1277568K), 0.8186925 secs] 8194.156: [GC 164766K->251028K(1277760K), 0.0123415 secs] 8194.169: [Full GC 251028K->164660K(1277760K), 0.8144430 secs] 在這段GC輸出中,每一項(xiàng)的含義如下:
?
我們知道,Java虛擬機(jī)的垃圾回收有兩種類型: 通GC 在GC信息的輸出中,[GC 164726K->251182K(1277568K), 0.0121369 secs]中的"GC"就 代表的普通GC,普通GC只回收部分垃圾對象,因此回收完畢后,系統(tǒng)中仍存在大量的垃 圾對象 全GC 即FULL GC,在GC信息的輸出中,[Full GC 251285K->164670K(1277376K), 0.8118171secs]的"FULL GC"就代表的完全GC,完全GC,系統(tǒng)徹底的對垃圾對象進(jìn)行回收,回收完 畢后,垃圾對象所占用的內(nèi)存得到徹底的回收,此時(shí)系統(tǒng)中存在的對象都是真正在使用 的活動對象,這時(shí)候的Java內(nèi)存真實(shí)地反映了Java對象所占用的內(nèi)存的大小。 在分析系統(tǒng)是否存在內(nèi)存泄漏時(shí),我們關(guān)注的是在當(dāng)時(shí)真正有用的對象所占用的內(nèi)存的 小。如果隨著系統(tǒng)的運(yùn)行,真正的Java對象所占用的內(nèi)存越來越大,那么基本上能夠確認(rèn)存在內(nèi)存泄漏(此時(shí)要排除系統(tǒng)是否設(shè)計(jì)了大量的緩存)。因此在做內(nèi)存泄漏的分析時(shí),我 只需要分析Full GC的行(非完全垃圾回收,由于并沒有將所有的垃圾都回收,因此對我們的 析沒有價(jià)值)。 以下面的例子為例進(jìn)行說明: ? 251285K 完全垃圾回收之前Java對象占用的內(nèi)存大小,這個(gè)值包含兩部分,一部分是正在 使用的Java對象占用的空間,另一部分是垃圾對象占用的空間。JAVA內(nèi)存泄漏分析和堆內(nèi)存設(shè)置 73 ? 164670K 完全垃圾回收之后Java對象占用的內(nèi)存大小,這個(gè)值是真正的活動Java對象占用 的內(nèi)存。 ? 1277376K 堆的設(shè)置最大值。 ? 0.8118171 secs 表示本次完全垃圾回收占用的時(shí)間。 判斷系統(tǒng)是否存在內(nèi)存泄漏的依據(jù)是:如果系統(tǒng)存在內(nèi)存泄漏,那么完全垃圾回收完之 的內(nèi)存值應(yīng)該持續(xù)上升。如果在現(xiàn)場能觀察到這個(gè)現(xiàn)象,說明系統(tǒng)存在內(nèi)存泄漏當(dāng)懷疑 個(gè)系統(tǒng)存在內(nèi)存泄漏的時(shí)候,首先使用FULL GC信息對內(nèi)存泄漏進(jìn)行一個(gè)初步確認(rèn),確認(rèn)統(tǒng)是否存在內(nèi)存泄漏。只檢查完全垃圾回收后的可用內(nèi)存值是否一直再增大,步驟如下31:. 首先截取系統(tǒng)穩(wěn)定運(yùn)行以后的GC信息(如初始化已經(jīng)完成),這個(gè)非常重要,非穩(wěn)定運(yùn)行 期的信息無分析價(jià)值,因?yàn)槟銦o法確認(rèn)內(nèi)存的增長是正常的增長還是由于內(nèi)存泄漏導(dǎo)致 的非正常增長。. 過濾出FULL GC的行。只有FULL GC的行才有分析價(jià)值。因?yàn)橥耆獹C后的內(nèi)存是當(dāng) 前Java對象真正使用的內(nèi)存數(shù)量。一般系統(tǒng)會有兩種可能: (a) 如果完全垃圾回收后的內(nèi)存持續(xù)增長32,大有一直增長到Xmx設(shè)定值的趨勢,那么這 個(gè)時(shí)候基本上就可以斷定系統(tǒng)存在內(nèi)存泄漏。 (b) 如果當(dāng)前完全垃圾回收后內(nèi)存增長到一個(gè)值之后,又能回落,總體上處于一個(gè)動態(tài) 平衡,那么內(nèi)存泄漏基本可以排除。 通過如上內(nèi)存使用趨勢分析之后,基本上就能確定系統(tǒng)是否存在堆內(nèi)存泄漏。 當(dāng)然這 GC信息分析只能告訴你系統(tǒng)是否存在堆內(nèi)存泄漏,但具體哪里泄漏,它是無法告訴你的。 存泄漏的的精確定位,是要找到內(nèi)存泄漏的具體位置,需要借助如下工具/手段之一可以找 真正導(dǎo)致內(nèi)存泄漏的類或者對象。?轉(zhuǎn)載于:https://www.cnblogs.com/wx170119/p/11316880.html
總結(jié)
以上是生活随笔為你收集整理的初步判断内存泄漏方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 万能的天涯er,我完了,我得罪领导了,怎
- 下一篇: 治疗女人宫寒的土方法