0%

故障问题收集

java.lang.OutOfMemoryError

1
2
3
4
5
6
7
8
9
10
11
12
13
这个服务有一个线程池,在代码里面设置的最小是8,最大限制是2147483647 ,用完的线程要1分钟之后才能回收。这就存在两个问题:
一、业务在持续不断的发送请求,这个服务就会一直创建线程,而因为给定的线程最大值过大,相当于可以无限制的创建线程了,会一直消耗资源;
二、用完的线程1分钟之后才会回收,时间过长。
在这两点的影响下,程序跑一段时间,就会出现创建大量的线程,过度的消耗内存资源.

由于docker容器在最初的时候没有做容器的内存限制,所以默认情况下容器使用的资源是不受限制的。
也就是可以使用主机内核调度器所允许的最大资源,因此当主机发现内存不够用的时候,也会抛出内存溢出的错误。而且会开始杀死一些进程用于释放内存空间。可怕的是任何进程都可能成为内核猎杀的对象,包括 docker daemon 和宿主机上的其它一些重要的程序。更危险的是如果某个支持系统运行的重要进程被kill掉了,整个系统也就宕掉了。

1、开发优化代码,包括限制线程池的最大线程数量和线程回收的时间,重新发布代码打补丁,后面观察到目前,没有再出现类这个问题了;
2、限制docker内存。重新优化了docker容器,限制了docker内存的使用量,减少docker容器过度占用宿主机资源的风险;
3、加强对docker容器的监控与告警;