java.lang.OutOfMemoryError: unable to create new native thread

概述


首先要明确一点,OutofMemory的问题基本上都是程序逻辑不对引起的。如果你碰到这种问题,要去检查代码逻辑。引起OutofMemoryError异常的原因有2种:
(1)Java虚拟机内存空间不足。
(2)可分配的native thread不足,无法开启更多的线程。
究竟是何种原因导致OutofMemory的,jconsole可以帮助我们很好的分析这个问题。jconsole 是一个内置 的Java 性能分析器,可以从命令行或 GUI shell 中启动,用来监控JVM的使用情况。在命令行或者terminal中输入jconsole,选择进程,启动jconsole后的界面如图:

Bug分析

Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread
	at java.lang.Thread.start0(Native Method)
	at java.lang.Thread.start(Thread.java:714)
        ......

通过jconosle发现,我的JVM堆空间使用了200多兆,活跃线程数是50个左右。而事实是,我的JVM最大内存空间900多兆,总的线程数量到达2500+。很明显这个bug不是由堆空间不足引起的,而是无法分配更多的本地线程。为什么总的线程数2500+,而活跃线程只有50个?原因可能是大量的线程在等待某项资源而阻塞,或者产生死锁。具体的情况可以通过jstack -pid命令进行分析。其实JDK已经告诉我们发生了什么:无法产生新的线程。

Debug的方法就是看代码,优化程序逻辑。在我的IDE里,用户登录的时候把密码输错很多次(40多次,为了测试)报了异常。原来,用户登录时会创建容量为40的线程池,重复几十次之后线程数达到2000多,导致程序崩溃。解决方法是只在密码正确的时候才生成线程池,这样就不会滥用线程了。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值