内存溢出,无法创建新的本地线程的原因和解决思路

内存溢出,无法创建新的本地线程的原因和解决方案

java.lang.OutofMemoryError:unable to create new natinve thread

 

可能原因

1、内存耗尽

2、超过了系统设置的线程数阈值

 

解决方法:(首先是排除了代码问题之后)

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

        相关指令

            jps -ml

            jstack pid (pid指的是进程号)

            查询线程数 jstack -l 28367 | grep 'java.lang.Thread.State' | wc -l

2、调整操作系统线程数阀值

            ulimit -u

        若阀值的大小太小,则可能导致oom

3、减小堆内存的大小   配置 -Xms 和 -Xmx

        查看线程的jvm信息

       查看堆的最大内存的大小 -Xmx jinfo -flag MaxHeapSize pid

       查看堆的初始内存的大小-Xms jinfo -flag InitialHeapSize pid   

        

4、减少线程数

        查看最大进程数   sysctl kernel.pid_max

         当前线程数    ps -eLf | wc -l

         修改最大进程数后系统恢复echo 1000000 > /proc/sys/kernel/pid_max

         永久生效echo "kernel.pid_max=1000000 " >> /etc/sysctl.conf    sysctl -p

5、减小线程栈的大小 配置 -Xss 256k

       查看java线程栈的大小  java -XX:+PrintFlagsFinal -version | grep ThreadStackSize

        查看线程栈的大小 jinfo -flag ThreadStackSize pid

6、增大os对线程的限制

        如果使用 Red Hat Enterprise Linux 6 ,编辑/etc/security/limits.d/90-nproc.conf,添加如下配置

        

        # /etc/security/limits.d/90-nproc.conf

        * soft nproc unlimited

 

        user - nproc 2048 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值