孤独酒馆|6000+字,30+张图。JAVA线上故障排查全套路总结( 三 )
Stack Overflow栈内存溢出 , 这个大家见到也比较多 。
Exception in thread "main" java.lang.StackOverflowError表示线程栈需要的内存大于Xss值 , 同样也是先进行排查 , 参数方面通过Xss来调整 , 但调整的太大可能又会引起OOM 。
使用JMAP定位代码内存泄漏上述关于OOM和StackOverflow的代码排查方面 , 我们一般使用JMAPjmap -dump:format=b,file=filename pid来导出dump文件
通过mat(Eclipse Memory Analysis Tools)导入dump文件进行分析 , 内存泄漏问题一般我们直接选Leak Suspects即可 , mat给出了内存泄漏的建议 。 另外也可以选择Top Consumers来查看最大对象报告 。 和线程相关的问题可以选择thread overview进行分析 。 除此之外就是选择Histogram类概览来自己慢慢分析 , 大家可以搜搜mat的相关教程 。
日常开发中 , 代码产生内存泄漏是比较常见的事 , 并且比较隐蔽 , 需要开发者更加关注细节 。 比如说每次请求都new对象 , 导致大量重复创建对象;进行文件流操作但未正确关闭;手动不当触发gc;ByteBuffer缓存分配不合理等都会造成代码OOM 。
另一方面 , 我们可以在启动参数中指定-XX:+HeapDumpOnOutOfMemoryError来保存OOM时的dump文件 。
gc问题和线程gc问题除了影响cpu也会影响内存 , 排查思路也是一致的 。 一般先使用jstat来查看分代变化情况 , 比如youngGC或者fullGC次数是不是太多呀;EU、OU等指标增长是不是异常呀等 。 线程的话太多而且不被及时gc也会引发oom , 大部分就是之前说的unable to create new native thread 。 除了jstack细细分析dump文件外 , 我们一般先会看下总体线程 , 通过pstreee -p pid |wc -l 。
或者直接通过查看/proc/pid/task的数量即为线程数量 。
堆外内存如果碰到堆外内存溢出 , 那可真是太不幸了 。 首先堆外内存溢出表现就是物理常驻内存增长快 , 报错的话视使用方式都不确定 , 如果由于使用Netty导致的 , 那错误日志里可能会出现OutOfDirectMemoryError错误 , 如果直接是DirectByteBuffer , 那会报OutOfMemoryError: Direct buffer memory 。
堆外内存溢出往往是和NIO的使用相关 , 一般我们先通过pmap来查看下进程占用的内存情况pmap -x pid | sort -rn -k3 | head -30 , 这段意思是查看对应pid倒序前30大的内存段 。 这边可以再一段时间后再跑一次命令看看内存增长情况 , 或者和正常机器比较可疑的内存段在哪里 。
我们如果确定有可疑的内存端 , 需要通过gdb来分析gdb --batch --pid {pid} -ex "dump memory filename.dump {内存起始地址} {内存起始地址+内存块大小}"
获取dump文件后可用heaxdump进行查看hexdump -C filename | less , 不过大多数看到的都是二进制乱码 。
推荐阅读
- 孤独酒馆|NVIDIA 助力文远知行在自动驾驶的路上“乘风破浪”
- 孤独酒馆|日本研究机构拆解华为P30 Pro:美企零部件比例不到1%
- 泽宇讲历史|女儿做了外国皇后,不愿向日本求助,49岁孤独去世,父亲是华人
- 环球网|“世界上最孤独的大象”被解救,曾被关了整整35年
- 新鲜事儿|却被渣男抛弃终身不孕,而今孤独一人,她是80年代最火的“琼瑶女郎”
- “世界上最孤独的大象”被解救,曾被关了整整35年
- 世界上最孤独的大象被解救:“世界上最孤独的大象”被解救,曾被关了整整35年
- kaavan|从小被当赚钱工具,35年后,世界上最孤独的大象终于解放了……
- 「孤独」九月,好好生活,好好爱
- 灵魂伴侣|当偶像有多孤独?“韩国最美的男人”38岁改变形象,曾经的灵魂伴侣已转嫁他人
