關(guān)于linux下內(nèi)存問題排查的工具

對最近linux下排查java內(nèi)存相關(guān)問題的命令做個(gè)小的總結(jié)

linux系列

top

top -p PID
pid為12415進(jìn)程的資源消耗情況眯搭。這里是以進(jìn)程為單位割去。

top -Hp PID


這里是以線程為單位。其中RES看到?jīng)]有線程占用的內(nèi)存都是3.3g,是因?yàn)镴VM內(nèi)存區(qū)域中大部分都是線程共享的类浪。
同時(shí)也可以通過shift+h在-p視圖下切換至線程視圖(set threads On),如下圖:

說明:top命令的TIME/TIME+是指的進(jìn)程/線程所使用的CPU時(shí)間肌似,不是進(jìn)程/線程啟動(dòng)到現(xiàn)在的時(shí)間费就,因此,如果一個(gè)進(jìn)程/線程使用的cpu很少川队,那即使這個(gè)進(jìn)程/線程已經(jīng)存在N長時(shí)間力细,TIME/TIME+也是很小的數(shù)值。

/proc/$pid/status

[#]$ cat /proc/12415/status
Name:   java
State:  S (sleeping)
Tgid:   12415
Pid:    12415
PPid:   1
TracerPid:  0
Uid:    502 502 502 502
Gid:    501 501 501 501
Utrace: 0
FDSize: 512
Groups: 501
VmPeak:  6734784 kB
VmSize:  6732236 kB
VmLck:         0 kB
VmHWM:   3476100 kB
VmRSS:   3473752 kB
VmData:  6560732 kB
VmStk:        88 kB
VmExe:         4 kB
VmLib:     17620 kB
VmPTE:      7404 kB
VmSwap:        0 kB
Threads:    108
SigQ:   0/23301
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000000002
SigCgt: 2000000181005ccd
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: ffffffffffffffff
Cpus_allowed:   f
Cpus_allowed_list:  0-3
Mems_allowed:   00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000001
Mems_allowed_list:  0
voluntary_ctxt_switches:    1
nonvoluntary_ctxt_switches: 1

其中VmRSS表示就是占用的物理內(nèi)存固额。Threads表示當(dāng)前開啟的線程數(shù)眠蚂。

特別說明RSS【實(shí)際使用物理內(nèi)存】的含義:resident set size, the non-swapped physical memory that a task has used (in kiloBytes). (alias rssize, rsz).

pmap

[~]$ pmap -d 12415
12415:   /usr/local/env/jdk1.8/bin/java -server -Xmx1024M -Xms1024M -Xmn512M -XX:MaxMetaspaceSize=128M -XX:MetaspaceSize=128M -XX:MaxDirectMemorySize=128M -XX:+UseConcMarkSweepGC -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 -XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses -XX:+CMSClassUnloadingEnabled -XX:+ParallelRefProcEnabled -XX:+CMSScavengeBeforeRemark -XX:-HeapDumpOnOutOfMemoryError -XX:+UseFastAccessorMethods -Xss256k -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=7 -XX:GCTimeRatio
Address           Kbytes Mode  Offset           Device    Mapping
0000000000400000       4 r-x-- 0000000000000000 0fc:00001 java
0000000000600000       4 rw--- 0000000000000000 0fc:00001 java
000000000116d000     996 rw--- 0000000000000000 000:00000   [ anon ]
00000000c0000000 1063680 rw--- 0000000000000000 000:00000   [ anon ]
0000000100ec0000 1033472 ----- 0000000000000000 000:00000   [ anon ]
0000003112e00000      88 r-x-- 0000000000000000 0fc:00001 libgcc_s-4.4.7-20120601.so.1
0000003112e16000    2044 ----- 0000000000016000 0fc:00001 libgcc_s-4.4.7-20120601.so.1
0000003113015000       4 rw--- 0000000000015000 0fc:00001 libgcc_s-4.4.7-20120601.so.1
00007f2c7d4a8000      12 r--s- 0000000000020000 0fc:00001 start.jar
00007f2c7d4ab000       4 rw--- 0000000000000000 000:00000   [ anon ]
00007f2c7d4ac000       4 r---- 0000000000000000 000:00000   [ anon ]
00007f2c7d4ad000       4 rw--- 0000000000000000 000:00000   [ anon ]
00007ffddeeed000      84 rw--- 0000000000000000 000:00000   [ stack ]
00007ffddef12000       4 r-x-- 0000000000000000 000:00000   [ anon ]
ffffffffff600000       4 r-x-- 0000000000000000 000:00000   [ anon ]
mapped: 6732236K    writeable/private: 3786640K    shared: 10820K

為方便展示省去中間部分內(nèi)容

這里看pmap重點(diǎn)是最后一行,進(jìn)程實(shí)際使用的物理內(nèi)存是writeable/private: 3786640K斗躏。
其他幾個(gè)點(diǎn)是什么意思呢逝慧?linux 會(huì)把一些shared libraries 載入到內(nèi)存中,在pmap 的輸出中瑟捣,這些shared libraries 的名字通常是 lib*.so 馋艺。如 libX11.so.6.2.0 。這個(gè) libX11.so.6.2.0 會(huì)被很多process load 到自己的運(yùn)行環(huán)境中迈套。上面展示的mapped的內(nèi)存就包含這部分和其他進(jìn)程共享的內(nèi)存【pmap is reporting virtual memory statistics which match top VIRT column . This is including data shared with other processes and other pages stored on disk.】捐祠。


google perf

gperftools是google開發(fā)的一款非常實(shí)用的工具集,主要包括:性能優(yōu)異的malloc free內(nèi)存分配器tcmalloc桑李;基于tcmalloc的堆內(nèi)存檢測和內(nèi)存泄漏分析工具h(yuǎn)eap-profiler,heap-checker踱蛀;基于tcmalloc實(shí)現(xiàn)的程序CPU性能監(jiān)測工具cpu-profiler窿给。可以對CPU時(shí)間片率拒、內(nèi)存等系統(tǒng)資源的分配合使用進(jìn)行分析崩泡。使用perf對一個(gè)程序分析一般分為下面幾個(gè)步驟:

  1. 加入對google-perftools庫的依賴
  2. 運(yùn)行目標(biāo)程序,并用某種方式啟動(dòng)/終止剖析函數(shù)并產(chǎn)生剖析結(jié)果
  3. 運(yùn)行剖析結(jié)果轉(zhuǎn)換工具猬膨,江不可讀的結(jié)果轉(zhuǎn)化成某種格式的文檔(pdf,txt,image等)

原理:該工具主要利用了unix的一個(gè)環(huán)境變量LD_PRELOAD角撞,它允許你要加載的動(dòng)態(tài)庫優(yōu)先加載起來,相當(dāng)于一個(gè)Hook勃痴,于是可以針對同一個(gè)函數(shù)可以選擇不同的動(dòng)態(tài)庫里的實(shí)現(xiàn)了谒所,比如googleperftools就是將malloc方法替換成了tcmalloc的實(shí)現(xiàn),這樣就可以跟蹤內(nèi)存分配路徑了沛申×恿欤可以理解為在分配內(nèi)存的同時(shí)增加內(nèi)存分配跟蹤的功能。

下面簡單說下針對JVM的分析過程:

  1. 在JVM參數(shù)中增加下面的配置:
export LD_PRELOAD=/usr/lib64/libtcmalloc.so
export HEAPPROFILE=/home/lg/temp
export HEAP_PROFILE_ALLOCATION_INTERVAL= 1073741824

LD_PRELOAD
perftools一切都是以tcmalloc為基礎(chǔ)铁材。這里指定tcmalloc的安裝位置尖淘;
HEAPPROFILE
指定heap profile存放的位置
HEAP_PROFILE_ALLOCATION_INTERVAL
每當(dāng)一定量的內(nèi)存被新申請分配出來時(shí),就會(huì)輸出profile文件著觉,這個(gè)變量值就是控制多少字節(jié)村生。默認(rèn)值是102410241024byte【1G】。一般情況下會(huì)調(diào)小一些饼丘。

  1. 運(yùn)行程序輸出heap文件
    在jvm中加入上面的參數(shù)后梆造,啟動(dòng)程序。這時(shí)候日志中會(huì)顯示類似下面的內(nèi)容:
Dumping heap profile to /home/lg/temp/_10030.0001.heap (1755151 MB allocated cumulatively, 1267 MB currently in use)

顯示累計(jì)的對外內(nèi)存的分配和當(dāng)前使用的對外內(nèi)存的大小葬毫。同時(shí)配置的對應(yīng)的目錄中會(huì)產(chǎn)生.heap文件。接下來的工作就是分析這些文件屡穗。

  1. 通過命令行分析文件
    命令:
pprof --text /usr/local/env/jdk1.8/bin/java _10030.0001.heap

輸出結(jié)果:

Using local file /usr/local/env/jdk1.8/bin/java.
Using local file _10030.0001.heap.
Total: 0.1 MB
     0.0  83.9%  83.9%      0.1  99.9% __FRAME_END__
     0.0   6.1%  90.0%      0.0   6.1% read_alias_file
     0.0   5.6%  95.6%      0.0   5.6% _nl_intern_locale_data
     0.0   3.1%  98.6%      0.0   3.1% _nl_make_l10nflist
     0.0   0.7%  99.3%      0.0   0.7% __gconv_lookup_cache
     0.0   0.3%  99.6%      0.0   0.3% strdup
     0.0   0.2%  99.8%      0.0   5.8% _nl_load_locale_from_archive
     0.0   0.1%  99.9%      0.0   0.7% __wcsmbs_load_conv
     0.0   0.1%  99.9%      0.0   0.1% std::basic_string::_Rep::_S_create
     0.0   0.0% 100.0%      0.0   0.0% set_binding_values
     0.0   0.0% 100.0%      0.0   0.0% new_composite_name
     0.0   0.0% 100.0%      0.0   0.0% 00007f5e3a5f3de1
     0.0   0.0% 100.0%      0.0   0.1% 00007f5e3a5f3dc0
     0.0   0.0% 100.0%      0.0   0.1% 00007f5e3a602405
     0.0   0.0% 100.0%      0.0   0.1% 0x00007ffc250bc6e0
     0.0   0.0% 100.0%      0.0   0.1% 0x2f6c61636f6c2f71
     0.0   0.0% 100.0%      0.0   9.2% __dcigettext
     0.0   0.0% 100.0%      0.0   0.7% __gconv_find_transform
     0.0   0.0% 100.0%      0.1  89.5% __libc_start_main
     0.0   0.0% 100.0%      0.0   0.1% _init
     0.0   0.0% 100.0%      0.0   0.1% _init (inline)
     0.0   0.0% 100.0%      0.0   6.1% _nl_expand_alias
     0.0   0.0% 100.0%      0.0   9.2% _nl_find_domain
     0.0   0.0% 100.0%      0.0   5.8% _nl_find_locale
     0.0   0.0% 100.0%      0.0   0.0% bindtextdomain
     0.0   0.0% 100.0%      0.0   0.7% mblen
     0.0   0.0% 100.0%      0.0   0.7% mbrtowc
     0.0   0.0% 100.0%      0.0   6.1% setlocale
     0.0   0.0% 100.0%      0.0   0.1% std::basic_string::basic_string
     0.0   0.0% 100.0%      0.0   0.1% std::basic_string::copy
     0.0   0.0% 100.0%      0.0   7.6% strerror
     0.0   0.0% 100.0%      0.0   7.6% strerror_r
     0.0   0.0% 100.0%      0.0   0.0% textdomain

以上不是實(shí)際問題的數(shù)據(jù)

結(jié)果代表的含義:

  • c1 Number of profiling samples in this function(函數(shù)分析樣本數(shù)量)
  • c2 Percentage of profiling samples in this function(函數(shù)分析樣本的百分比)
  • c3 Percentage of profiling samples in the functions printed so far(
    到目前為止打印的函數(shù)中的分析樣本的百分比)
  • c4 Number of profiling samples in this function and its callees(
    此函數(shù)及其被調(diào)用者的性能分析樣本數(shù))
  • c5 Percentage of profiling samples in this function and its callees(此函數(shù)及其被調(diào)用者的性能分析樣本的百分比)
  • c5 Function name

通過perftools可以定位可能引起問題的函數(shù)或者有嫌疑的內(nèi)存地址贴捡。針對JVM進(jìn)程可能需要進(jìn)一步借用其他工具來分析。

參考鏈接:
heap_checker
perftoos使用心得

下一篇再介紹JVM相關(guān)的工具村砂。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末烂斋,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子础废,更是在濱河造成了極大的恐慌汛骂,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件评腺,死亡現(xiàn)場離奇詭異帘瞭,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)蒿讥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門蝶念,熙熙樓的掌柜王于貴愁眉苦臉地迎上來抛腕,“玉大人,你說我怎么就攤上這事媒殉〉5校” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵廷蓉,是天一觀的道長全封。 經(jīng)常有香客問我,道長桃犬,這世上最難降的妖魔是什么刹悴? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮疫萤,結(jié)果婚禮上颂跨,老公的妹妹穿的比我還像新娘。我一直安慰自己扯饶,他們只是感情好恒削,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著尾序,像睡著了一般钓丰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上每币,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天携丁,我揣著相機(jī)與錄音,去河邊找鬼兰怠。 笑死梦鉴,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的揭保。 我是一名探鬼主播肥橙,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼秸侣!你這毒婦竟也來了存筏?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤味榛,失蹤者是張志新(化名)和其女友劉穎椭坚,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體搏色,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡善茎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了频轿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片巾表。...
    茶點(diǎn)故事閱讀 39,779評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡汁掠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出集币,到底是詐尸還是另有隱情考阱,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布鞠苟,位于F島的核電站乞榨,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏当娱。R本人自食惡果不足惜吃既,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望跨细。 院中可真熱鬧鹦倚,春花似錦、人聲如沸冀惭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽散休。三九已至媒楼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間戚丸,已是汗流浹背划址。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留限府,地道東北人夺颤。 一個(gè)月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像胁勺,于是被迫代替她去往敵國和親拂共。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Lua 5.1 參考手冊 by Roberto Ierusalimschy, Luiz Henrique de F...
    蘇黎九歌閱讀 13,791評論 0 38
  • pyspark.sql模塊 模塊上下文 Spark SQL和DataFrames的重要類: pyspark.sql...
    mpro閱讀 9,451評論 0 13
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理姻几,服務(wù)發(fā)現(xiàn),斷路器势告,智...
    卡卡羅2017閱讀 134,654評論 18 139
  • jvm原理 Java虛擬機(jī)是整個(gè)java平臺(tái)的基石咱台,是java技術(shù)實(shí)現(xiàn)硬件無關(guān)和操作系統(tǒng)無關(guān)的關(guān)鍵環(huán)節(jié)络拌,是java...
    AI喬治閱讀 17,242評論 21 486
  • 對不起春贸,我總是那么自以為是混萝,以為自己對你很重要,其實(shí)不過是個(gè)可有可無的人 萍恕,抱歉打擾了逸嘀,這次是真的要走了,我不回頭...
    凌柒兒閱讀 188評論 0 0