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

时间:2022-11-17 17:33:39

短信平台在运行过程中出现了如下错误:java.lang.OutOfMemoryError: unable to create new native thread

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

再次分析一下问题原因:

背景:在短信平台程序中有一个接收线程TheadA,每次接收到网关返回的短信响应后线程TheadA 就会new一个新的线程,去执行数据库操作,

我今天修改了短信发送的速度,100条/秒.所以理论上每秒钟TheadA回new100新线程去进行数据库处理.由于能创建的线程数是有限的.所以抛出了上图的异常信息.

在网上搜索了大家做的相关实验性证明,我就不在多次一举了.下面记录一下大家的结论:

能创建的线程数的具体计算公式如下:
(MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = Number of threads
MaxProcessMemory 指的是一个进程的最大内存
JVMMemory JVM内存
ReservedOsMemory 保留的操作系统内存
ThreadStackSize 线程栈的大小

在java语言里,当你创建一个线程的时候,虚拟机会在JVM内存创建一个Thread对象同时创建一个操作系统线程,而这个系统线程的内存用的不是JVMMemory,
而是系统中剩下的内存(MaxProcessMemory - JVMMemory - ReservedOsMemory)。

-Xms 为jvm启动时分配的内存,比如-Xms200m,表示分配200M
-Xmx 为jvm运行过程中分配的最大内存,比如-Xms500m,表示jvm进程最多只能够占用500M内存
-Xss 为jvm启动的每个线程分配的内存大小,默认JDK1.4中是256K,JDK1.5+中是1M

线程的死亡并不意味着线程对象的销毁和回收。线程的死亡指的是当线程的run方法结束后,该线程就无法被重用和启动,但它的对象还存在并且它的属性和方法还一样可以被使用.

参考来源:

  http://sesame.iteye.com/blog/622670

  http://www.mzone.cc/article/321.html