OOM问题 排查

OOM问题 排查

通过以下错误信息,推断可能是服务器内存不够,不能创建新的线程

OpenJDK 64-Bit Server VM warning: Attempt to protect stack guard pages failed.
OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00007f2332eaf000, 12288, 0) failed; error='Cannot allocate memory' (errno=12)
OpenJDK 64-Bit Server VM warning: #
INFO: os::commit_memory(0x00007f2332fb0000, 12288, 0) failed; error='Cannot allocate memory' (errno=12)# There is insufficient memory for the Java Runtime Environment to continue.

# Native memory allocation (mmap) failed to map [thread 139789156943616 also had an error]

但是重新启动程序后,通过free -h查看服务器仍然剩余14G内存,而且java程序已经固定了堆内存为4g,所以考虑是否是创建线程太多,导致内存不够(1个线程1Mb内存,创建1000多个线程也才用1g,除非是无限制的创建线程)。

查看线程数量,高达1450,远远超过自定义的所有线程池数量,而且每隔一段时间线程都在增长。


image.png

使用arthas的`thread -all'命令查看有哪些线程

image.png

通过关键子过滤,发现定时任务的线程数量高达991个,说明定时任务有bug。需要去解决。

image.png

发现定时任务框架中,有一个bug,每次执行定时任务时。都会创建线程池,里面有一个线程异步执行定时任务。当定时任务对象被回收后,里面的线程池对象未被回收。导致程序中的线程数量不断增加,最后服务器内存用尽。

image-3.png

你可能感兴趣的:(OOM问题 排查)