【线上问题笔记】java.lang.OutOfMemoryError: unable to create new native thread
运维反馈项目挂了,起来后一会又挂了,并贴出一些错误日志 java.lang.OutOfMemoryError: unable to create new native thread
排查过程:
* mq有堆积,但是之前报警关掉了。
* top观察cpu,内存,发现VIRT 持续攀高达几十个G,然后就挂掉了
* 开始时,想dump一下服务,来排查,文件较大,费时较长,
ps -ef|grep java
jmap -dump:format=b,file=001.hprof 131652
* 期间又观察进程-线程等数据
查看最大进程数
[dev@10-0-4-64 logs]$ sysctl kernel.pid_max
kernel.pid_max = 147456
查看当前进程数
[dev@10-0-4-64 logs]$ ps -eLf|wc -l
20352
没有超过最大进程数(网上有说这个原因报unable to create new native thread), 排除!!
* 后来看该进程的线程数
[dev@10-0-4-64 logs]$ pstree -p 131652 |wc -l
1079
也可以用top来看
[dev@10-0-4-64 logs]$ top -H -p 131652
* 这时,我就发现问题出在线程身上, 找运维dump下线程信息
* jstack 131652 > jstack20220217.txt
观察线程文件发现,大量block
java.lang.Thread.State: BLOCKED (on object monitor)
其实,直接在这个文件上统计也行
grep 'Thread.State' jstack.txt|awk '{print $2$3$4$5}'|sort |uniq -c
这样看也一目了然
$ grep 'Thread.State' jstack.txt |awk '{print $2$3$4$5}'|sort|uniq -c
12586 BLOCKED(onobjectmonitor)
137 RUNNABLE
50 TIMED_WAITING(onobjectmonitor)
93 TIMED_WAITING(parking)
8 TIMED_WAITING(sleeping)
2 WAITING(onobjectmonitor)
729 WAITING(parking)
结论: 大量的车辆轨迹消息(堆积了)发过来,处理的逻辑里面有一个方法加了synchronized同步
private synchronized void formatMap(Map<string,object> dataMap,
Map<string, object=""> info)