jvm内存问题定位
本文于 1956 天之前发表,文中内容可能已经过时。
linux 进程 内存查看
ps -p $pid -o rss,vsz
查看应用逻辑内存,和实际物理内存使用。
pmap -x $pid | sort -n -k3
top -c
sar
1 | 怀疑CPU存在瓶颈,可用 sar -u 和 sar -q 等来查看 |
参考资料
1 | https://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/sar.html |
gdb
gdb –batch –pid 11 -ex “dump memory a.dump 0x7fd488000000 0x7fd488000000+56124000”
1 | strings a.dump | less |
查看应用内存块。
strace
堆内内存查看
1 预先防范
在启动项目的时候添加
1 | -XX:+HeapDumpOnOutOfMemoryError |
这种情况下,一旦内存溢出,会打印一个 *.hprof的文件
2 直接打印 .hprof ,线上慎用。
1 | jmap -heap 7732 |
3 hprof文件分析
mat 内存分析:
1: 找到使用内存最多的元素
2: 可达性分析
3: 谁在引用。
相关资料
https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/clopts001.html
https://www.cnblogs.com/cellei/p/12240241.html
堆外内存查看
安装 google-perftools
https://github.com/gperftools/gperftools
1 | https://www.ibm.com/developerworks/cn/linux/l-cn-perf1/index.html |
查看线程的内存使用
cat /proc/{pid}/smaps > smaps.txt
参考资料:
1 | https://www.jianshu.com/p/309c9f61d495 |
需要解决的疑问
young gc 什么时候触发 ?
full gc 什么时候触发?
jvm 的内存计算
堆内内存 + 堆外内存+线程使用内存。
相关资料
内存的定义
1 | VSS- Virtual Set Size 虚拟耗用内存(包含共享库占用的内存) |
mmap 文件
1 | https://baike.baidu.com/item/mmap/1322217 |