java -Dsun.nio.MaxDirectMemorySize=4g -XX:NativeMemoryTracking=detail -jar test-mem-0.0.1-SNAPSHOT.jar
java应用的pid=23707
-
top -p 23707 (top -H -p 23707查看详细线程)
image.png
按cpu排序 : 键入大写P (SHIFT+p)
按内存排序: 键入大写M (SHIFT+m) - cat /proc/23707/statm
[mmlog@mmjr-5 ~]$ cat /proc/23707/statm (top中VIRT RES SHR的来源)
1933094 81186 3366 1 0 1896801 0
1933094 * 4k = 7732376k = 7551m VIRT
81186 * 4k = 324744k = 317m RES (正在使用的内存)
3366 * 4k = 13464 k = 13 m
-
pmap -x 23707 查看某个进程内存分布
image.png
image.png
-
cat /proc/23707/smaps 查看某个进程内存详细
-
java应用:jcmd 23707 VM.native_memory detail | jcmd 23707 VM.native_memory
jcmd命令显示的内存包含堆内内存、Code区域、通过unsafe.allocateMemory和DirectByteBuffer申请的内存,不包含其他Native Code(C代码)申请的堆外内存
-
监控系统内存分配情况 strace -f -e"brk,mmap,munmap" -p 23707
image.png
23734 为十进制线程号对应到16进制为0x5cb6
jstack -l 23707 | grep 5cb6 可查看内存的调用者
-
查看内存中的内容
gdp -pid pid 进入GDB 使用命令 dump memory mem.bin startAddress endAddressdump
(其中startAddress和endAddress可以从/proc/pid/smaps中查找)
strings mem.bin查看dump的内容 -
jmap 的使用,其中-histo:live 会触发gc
jmap -histo:live 23707 | head -n 13 :显示gc后占用内存前10对象类型
jmap -histo:live 23707 |sort -k 2 -nr | head -n 13 :显示gc后占用数量大小前10对象类型
jmap -histo:live 23707 |sort -k 3 -nr | head -n 13 :显示gc后占用内存大小前10对象类型
jmap -dump:live,format=b,file=heap.bin 23707
8.1 jstat -gcutil process_id 1000
8.2 cat /proc/29835/smaps | grep Rss | grep -E -o '[0-9]*' | awk '{(sum=sum+$1)} END {print sum}'
8.3 UseAdaptiveSizePolicy影响SurvivorRatio=8的设置
8.4 jvm -XX:+AlwaysPreTouch java启动使用所有设置内存
- 使用strace没有发现问题也可以使用ltrace尝试一下
-
常用的系统监控命令
image.png
网友评论