unable to create new native thread异常分析

问题现象

HBase的RegionServer服务以及对应的节点均出现了OOM现象。
在DataNode服务节点上信息如下:
ERROR:DataNode is out of memory. Will retry in 30 seconds.
unable to create new native thread

问题分析

根据反馈的信息,程序报 unable to create new native thread异常
其中java.lang.OutOfMemoryError: unable to create new native thread是很常见的一种,这类错误通常发生在应用试图
创建新线程时:
可能原因
1.创建线程数超过了操作系统的限制
2. 系统内存耗尽,无法为新线程分配内存

1.排查应用是否创建了过多的线程

通过jstack确定应用创建了多少线程,命令:
jstack 103366|grep java.lang.Thread.State|wc -l
ps -eLf|wc -l

操作系统会限制进程允许创建的线程数,查看命令:
ulimit -u

现场发现系统线程数并未超过设置值100000,因此可以排除不是因为1.创建线程数超过了操作系统的限制 导致问题发生

2.排查是否是因为内存不足导致问题发生

通过free命令查看出现问题节点出现了内存基本占满的情况。
节点上有yarn spark等容器在跑,压力较大

解决方案

1.减小堆内存

因为线程不在堆内存上创建,线程在堆内存之外的内存上创建。所以如果分配了堆内存之后只剩下很少的可用内存,依然可能遇到
java.lang.OutOfMemoryError: unable to create new native thread。考虑如下场景:
系统总内存10G,堆内存分配了9G,永久代512M。在这种情况下,JVM占用了9.5G内存,
系统进程、其他用户进程只占用剩下的0.5G内存,非常可能没有足够的可用内存创建新的线程。
如果是这种情况,可以考虑通过减小堆内存。

2. 减小线程栈大小

线程会占用内存,如果每个线程都占用更小内存,整体上将消耗更少的内存,就不会引发无可用内存创建线程的异常。
可以利用-Xss参数限制线程内存大小,降低总内存消耗。例如,JVM默认每个线程占用1M内存,应用有1000个线程,
那么将消耗1000M内存空间。如果实际上500K内存足够线程正常运行,配置-Xss500k,那么1000个线程将只需要消耗500M内存。
注意:根据实际情况设置-Xss的,避免产生java.lang.StackOverflowError错误

现场采用减少容器实际使用内存总量,实施后,系统运行正常。未出现OOM,线程创建失败异常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

spring208208

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值