自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Java程序內(nèi)存分析:使用mat工具分析內(nèi)存占用

開(kāi)發(fā) 后端
在工作中可能會(huì)遇到內(nèi)存溢出這種災(zāi)難性的問(wèn)題,那么程序肯定是存在問(wèn)題,找出問(wèn)題至關(guān)重要,上一篇文章講了jmap命令的使用方法,當(dāng)然用jmap導(dǎo)出的文件我們也看不懂啊,那就交給memory analyzer(mat)這個(gè)工具,讓他幫助我們來(lái)觀察程序的內(nèi)存分布情況吧。

MAT 不是一個(gè)***工具,它并不能處理所有類(lèi)型的堆存儲(chǔ)文件。但是比較主流的廠家和格式,例如 Sun, HP, SAP 所采用的 HPROF 二進(jìn)制堆存儲(chǔ)文件,以及 IBM 的 PHD 堆存儲(chǔ)文件等都能被很好的解析。下面來(lái)看看要怎么做呢,也許對(duì)你有用。官方文檔:http://help.eclipse.org/luna/index.jsp?topic=/org.eclipse.mat.ui.help/welcome.html

造成OutOfMemoryError原因一般有2種:

1、內(nèi)存泄露,對(duì)象已經(jīng)死了,無(wú)法通過(guò)垃圾收集器進(jìn)行自動(dòng)回收,通過(guò)找出泄露的代碼位置和原因,才好確定解決方案;

2、內(nèi)存溢出,內(nèi)存中的對(duì)象都還必須存活著,這說(shuō)明Java堆分配空間不足,檢查堆設(shè)置大?。?Xmx與-Xms),檢查代碼是否存在對(duì)象生命周期太長(zhǎng)、持有狀態(tài)時(shí)間過(guò)長(zhǎng)的情況。

1. 用jmap生成堆信息
 

    這樣在E盤(pán)的jmap文件夾里會(huì)有一個(gè)map.bin的堆信息文件 

2. 將堆信息導(dǎo)入到mat中分析   

3. 生成分析報(bào)告

mat可以為我們生成多個(gè)報(bào)告:

下面來(lái)看看生成的這些數(shù)據(jù)對(duì)我們有什么幫助

從上圖可以看到它的大部分功能,在餅圖上,你會(huì)發(fā)現(xiàn)轉(zhuǎn)儲(chǔ)的大小和數(shù)量的類(lèi),對(duì)象和類(lèi)加載器。

正確的下面,餅圖給出了一個(gè)印象***的對(duì)象轉(zhuǎn)儲(chǔ)。移動(dòng)你的鼠標(biāo)一片看到對(duì)象中的對(duì)象的細(xì)節(jié)檢查在左邊。下面的Action標(biāo)簽中:

  • Histogram可以列出內(nèi)存中的對(duì)象,對(duì)象的個(gè)數(shù)以及大小。

  • Dominator Tree可以列出那個(gè)線程,以及線程下面的那些對(duì)象占用的空間。

  • Top consumers通過(guò)圖形列出***的object。

  • Leak Suspects通過(guò)MA自動(dòng)分析泄漏的原因。

Histogram

  • Class Name : 類(lèi)名稱(chēng),java類(lèi)名

  • Objects : 類(lèi)的對(duì)象的數(shù)量,這個(gè)對(duì)象被創(chuàng)建了多少個(gè)

  • Shallow Heap :一個(gè)對(duì)象內(nèi)存的消耗大小,不包含對(duì)其他對(duì)象的引用

  • Retained Heap :是shallow Heap的總和,也就是該對(duì)象被GC之后所能回收到內(nèi)存的總和


一般來(lái)說(shuō),Shallow Heap堆中的對(duì)象是它的大小和保留內(nèi)存大小相同的對(duì)象是堆內(nèi)存的數(shù)量時(shí),將釋放對(duì)象被垃圾收集。
保留設(shè)置一組主要的對(duì)象,例如一個(gè)特定類(lèi)的所有對(duì)象,或所有對(duì)象的一個(gè)特定的類(lèi)裝入器裝入的類(lèi)或者只是一群任意對(duì)象,是釋放的組對(duì)象如果所有對(duì)象的主要設(shè)置變得難以接近的。保留設(shè)置包括這些對(duì)象以及所有其他對(duì)象只能通過(guò)這些對(duì)象。保留大小是總堆大小中包含的所有對(duì)象的保留。摘自eclipse


關(guān)于的詳細(xì)講解,建議大家查看Shallow heap & Retained heap,這是個(gè)很重要的概念。

這兒借助工具提供的regex正則搜索一下我們自己的類(lèi),排序后看看哪些相對(duì)是占用比較大的。

左邊可以看到類(lèi)的詳細(xì)使用,比如所屬包,父類(lèi)是誰(shuí),所屬的類(lèi)加載器,內(nèi)存地址,占用大小和回收情況等

#p#

這兒有個(gè)工具可以根據(jù)自己的需求分組查找,默認(rèn)根據(jù)class分組,類(lèi)似我們sql里的group by了~~

這里可以看到上面3個(gè)選項(xiàng),分別生成overview、leak suspects、top components數(shù)據(jù),但是這兒生成的不是圖表,如果要看圖表在(Overview)中的Action標(biāo)簽里點(diǎn)擊查看。

這個(gè)是Overview中的 Heap Dump Overview視圖,從工具欄中點(diǎn)開(kāi),這是一個(gè)全局的內(nèi)存占用信息

Used heap dump 79.7 MB
Number of objects 1,535,626
Number of classes 8,459
Number of class loaders 74
Number of GC roots 2,722
Format hprof
JVM version
 
Time 格林尼治標(biāo)準(zhǔn)時(shí)間+0800上午9時(shí)20分37秒
Date 2014-7-2
Identifier size 32-bit
File path E:\jmap\map.bin
File length 108,102,005
  • Total: 12 entries


 

然后可以點(diǎn)開(kāi)SystemProperties和Thread Overview進(jìn)行查看,我這里就不貼了內(nèi)容比較多。
 

Dominator Tree

我們可以看到ibatis占了較多內(nèi)存

Top consumers

這張圖展示的是占用內(nèi)存比較多的對(duì)象的分布,下面是具體的一些類(lèi)和占用。

按等級(jí)分布的類(lèi)使用情況,其實(shí)也就是按使用次數(shù)查看,java.lang.Class被排在***

還有一張圖是我們比較關(guān)心的,那就是按包名看占用,根據(jù)包我們知道哪些公共用的到j(luò)ar或自己的包占用
 

這樣就可以看到包和包中哪些類(lèi)的占用比較高。
 

#p#

Leak Suspects

從這份報(bào)告,看到該圖深色區(qū)域被懷疑有內(nèi)存泄漏,可以發(fā)現(xiàn)整個(gè)heap只有79.7M內(nèi)存,深色區(qū)域就占了62%。所以,MAT通過(guò)簡(jiǎn)單的報(bào)告就說(shuō)明了項(xiàng)目是有可疑代碼的,具體點(diǎn)開(kāi)詳情來(lái)找到類(lèi),

點(diǎn)擊鼠標(biāo),在List Objects-> with outgoing references下可以查看該類(lèi)都引用了什么對(duì)象,由此查看是否因?yàn)槠渌麑?duì)象導(dǎo)致的內(nèi)存問(wèn)題。

下面繼續(xù)查看pool的gc ROOT

如下圖所示的上下文菜單中選擇 Path To GC Roots -> exclude weak references, 過(guò)濾掉弱引用,因?yàn)樵谶@里弱引用不是引起問(wèn)題的關(guān)鍵。

進(jìn)入查看即可,我這兒的代碼沒(méi)有問(wèn)題,就不用貼了。
 


The classloader/component "org.apache.catalina.loader.WebappClassLoader @ 0xa34cde8" occupies 19,052,864 (22.80%) bytes. The memory is accumulated in one instance of "java.util.HashMap$Entry[]" loaded by "<system class loader>".

Keywords
java.util.HashMap$Entry[]
org.apache.catalina.loader.WebappClassLoader @ 0xa34cde8


這段話是在工具中提示的,他告訴我們WebappClassLoader占了19,052,864 字節(jié)的容量,這是tomcat的類(lèi)加載器,JDK自帶的系統(tǒng)類(lèi)加載器中占用比較多的是HashMap。這個(gè)其實(shí)比較正常,大家經(jīng)常用map作為存儲(chǔ)容器。

除了在上一頁(yè)看到的描述外,還有Shortest Paths To the Accumulation Point和Accumulated Objects部分,這里說(shuō)明了從GC root到聚集點(diǎn)的最短路徑,以及完整的reference chain。觀察Accumulated Objects部分,java.util.HashMap的retained heap(size)***,所以明顯類(lèi)實(shí)例都聚集在HashMap中了。

來(lái)看看Accumulated Objects by Class區(qū)域,這里能找到被聚集的對(duì)象實(shí)例的類(lèi)名。java.util.HashMap類(lèi)上頭條了,被實(shí)例化了5573次,從這兒看出這個(gè)程序不存在什么問(wèn)題,因?yàn)檫@個(gè)數(shù)字是比較正常的,但是當(dāng)出問(wèn)題的時(shí)候我們都會(huì)看到比較大的自定義類(lèi)會(huì)在前面,而且占用是相當(dāng)高。

當(dāng)然,mat這個(gè)工具還有很多的用法,這里把我了解的分享給大家,不管如何,最終我們需要得出系統(tǒng)的內(nèi)存占用,然后對(duì)其進(jìn)行代碼或架構(gòu),服務(wù)器的優(yōu)化措施!

參考文獻(xiàn):

http://www.eclipse.org/mat/about/screenshots.php

http://www.ibm.com/developerworks/cn/opensource/os-cn-ecl-ma/

本文出自:http://my.oschina.net/biezhi/blog/286223

責(zé)任編輯:林師授 來(lái)源: oschina
相關(guān)推薦

2015-08-21 09:56:17

Java內(nèi)存分析MAT使用

2013-07-23 06:56:12

Android內(nèi)存機(jī)制APP內(nèi)存使用情況Android開(kāi)發(fā)學(xué)習(xí)

2009-05-12 10:27:53

Java開(kāi)發(fā)內(nèi)存分析

2015-08-06 14:54:50

JavaScript分析工具OneHeap

2021-11-04 11:54:30

Linux內(nèi)存系統(tǒng)

2018-04-17 14:41:41

Java堆內(nèi)存溢出

2013-08-02 09:52:14

AndroidApp內(nèi)存泄漏

2023-02-10 09:28:23

優(yōu)化工具

2023-05-29 07:17:48

內(nèi)存溢出場(chǎng)景

2013-08-02 10:06:36

Android內(nèi)存溢出

2021-04-23 20:59:02

ThreadLocal內(nèi)存

2017-11-09 16:07:00

Web應(yīng)用內(nèi)存

2012-06-05 00:41:07

JavaJava內(nèi)存

2015-11-16 11:22:05

Java對(duì)象內(nèi)存分配

2020-02-09 17:23:17

Python數(shù)據(jù)字典

2013-11-26 16:05:24

Linux共享內(nèi)存

2020-12-07 06:23:48

Java內(nèi)存

2011-08-16 09:34:34

Nginx

2018-07-03 09:00:00

Redis內(nèi)存分析工具

2011-11-22 09:57:24

Node.js
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)