服务器挂掉问题排查记录

1、查日志
java.lang.OutOfMemoryError: unable to create new native thread
这个错误表明Java虚拟机(JVM)在尝试创建新的本地线程时失败了。这通常是由于操作系统的线程限制导致的,而不是由于Java堆内存不足。

在Linux和Unix系统中,每个进程可以创建的线程数通常受到ulimit命令中的-u选项的限制。当这个限制被达到时,即使Java堆内存还有剩余空间,JVM也无法创建新的线程,因为操作系统不允许进程创建更多的线程。

要解决这个问题,你可以尝试以下方法:

1、增加操作系统的线程限制:
你可以使用ulimit -u命令来临时增加当前会话的线程限制。例如,ulimit -u 4096会将线程限制设置为4096。但请注意,这只是临时性的,并且只对当前会话有效。

要永久更改线程限制,你需要在系统的启动脚本中设置,比如在/etc/security/limits.conf文件中为特定用户或用户组设置线程限制。
2、检查并优化Java应用程序:
如果应用程序需要创建大量的线程,这可能是一个设计上的问题。通常,使用线程池(如java.util.concurrent.ThreadPoolExecutor)来管理和复用线程是一个更好的做法,这样可以避免频繁地创建和销毁线程。
top -H 可以查看当前所有进程的线程数量
top -H -p pid(进程id):查看某个进程的线程数
在Spring Boot应用中,如果你在方法中手动创建了一个ThreadPoolExecutor(或任何其他类型的线程池),那么这些线程不会在你的方法执行完毕后自动释放。线程池的生命周期是由你自己管理的,这意味着你需要显式地关闭线程池来释放资源。

如果你不再需要线程池,你应该调用它的shutdown()或shutdownNow()方法来关闭它。shutdown()方法会等待当前正在执行的任务完成后再关闭线程池,而shutdownNow()方法会尝试停止所有正在执行的任务并立即关闭线程池。

3、增加系统资源:
如果应用程序确实需要大量的线程,并且受到系统限制,你可能需要增加系统的资源,比如增加物理内存或调整操作系统的配置来允许更多的线程。

4、检查是否有线程泄漏:
确保应用程序在不再需要线程时正确地关闭它们。线程泄漏(即不再使用的线程没有被正确终止)可能会导致线程数量累积,最终耗尽系统资源。

5、监控和日志记录:
使用监控工具来跟踪应用程序的线程创建和销毁情况,以及系统级别的线程限制。这可以帮助你更好地理解问题的根源,并在必要时进行调整。

此次服务器挂掉是由于开发人员在方法中创建了线程池,并没有显示释放掉,导致线程在持续增加,最后达到用户线程最大值,微服务崩溃
备注:
在Ubuntu服务器上,你可以使用ulimit命令来修改用户的资源限制,包括线程限制。但是,请注意,ulimit设置的限制仅对当前shell及其子进程有效。一旦shell退出,这些设置将不再有效。

要修改用户的线程限制,你可以按照以下步骤操作:

临时修改:
你可以在当前shell中使用ulimit命令来修改线程限制。例如,要将线程限制设置为1024,你可以执行:

bash
ulimit -u 1024
你可以通过ulimit -a查看当前所有的资源限制。
2. 永久修改:

如果你希望这些设置在用户登录时始终生效,你需要在用户的bash配置文件中设置它们。通常,这是~/.bashrc或~/.bash_profile文件。

打开用户的~/.bashrc文件(或~/.bash_profile,取决于你的系统和配置):

bash
nano ~/.bashrc
在文件的末尾,添加以下行:

bash
ulimit -u 1024
保存并关闭文件。然后,为了让更改生效,你可以执行:

bash
source ~/.bashrc
系统级别的修改:
如果你希望修改系统级别的线程限制,你需要编辑/etc/security/limits.conf文件。

打开该文件:

bash
sudo nano /etc/security/limits.conf
然后,在文件的末尾,你可以添加以下内容来限制特定用户的线程数:

bash
username hard nproc 1024
username soft nproc 1024

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值