文档章节

OutOfMemoryError: unable to create new native thread

秋风醉了
 秋风醉了
发布于 2016/09/08 18:38
字数 487
阅读 744
收藏 0

OutOfMemoryError: unable to create new native thread

这个错误是由于创建了太多的线程导致的。创建线程的数量可以由下面公式计算出来:

(MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = Number of threads 

MaxProcessMemory:进程最大寻址空间。
JVMMMEMORY:jvm的内存空间(堆+永久区)-Xmx大小 (应该是实际分配大小)
ReservedOsMemory:操作系统预留内存
ThreadStackSize:-Xss大小

计算过程请参考:https://segmentfault.com/a/1190000004694232

重现该异常如下,

import java.util.concurrent.CountDownLatch;

class TestThread extends Thread {


    CountDownLatch count = new CountDownLatch(1);

    public TestThread() {
        this.setDaemon(true);
    }

    /**
     * 线程一直等待
     */
    @Override
    public void run() {
        try {
            count.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}

public class XssTest {
    public static void main(String args[]) {

        for (int i = 0; ; i++) {
            System.out.println("i = " + i);
            new Thread(new TestThread()).start();
        }
    }
}

运行结果:

i = 2027
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)
	at XssTest.main(XssTest.java:37)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:497)
	at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)

-Xss(ThreadStackSize)参数的作用

---the stack size for each thread

JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成。

使用不同的Xss参数来运行下面这个程序,

public class XssDemo {

    private static int count = 0;

    public static void recursion() {
        //减少局部变量的声明,可以节省栈帧大小,增加调用深度
        long a = 1, b = 2, c = 3, d = 4, e = 5, f = 6, q = 7, x = 8, y = 9, z = 10;
        count++;
        recursion();
    }

    public static void main(String args[]) {
        try {
            recursion();
        } catch (Throwable e) {
            System.out.println("deep of calling = " + count);
//            e.printStackTrace();
        }
    }
}

运行如下,

➜  helloworld java -Xmx128m -Xms128m -Xss1024k XssDemo
deep of calling = 12401
➜  helloworld java -Xmx128m -Xms128m -Xss512k XssDemo
deep of calling = 3524

当线程栈设置的较大时,栈的深度会比较大。

-Xmx -Xms -Xss对线程创建数量的影响

参见http://jzhihui.iteye.com/blog/1271122

-Xms

intial java heap size

-Xmx

maximum java heap size

-Xss

the stack size for each thread

===========END===========

© 著作权归作者所有

秋风醉了
粉丝 252
博文 532
码字总数 405690
作品 0
朝阳
程序员
私信 提问
加载中

评论(2)

今天来找bug
今天来找bug
spark 和storm在同一个机器上跑,时间久了就会出异常,两个作业相互抢资源
今天来找bug
今天来找bug
我也遇到过这个异常
OutOfMemoryError系列(5): Unable to create new native thread

这是本系列的第五篇文章, 相关文章列表: OutOfMemoryError系列(1): Java heap space OutOfMemoryError系列(2): GC overhead limit exceeded OutOfMemoryError系列(3): Permgen space O......

renfufei
2017/09/25
0
0
java.lang.OutOfMemoryError异常解决方法

原因: 常见的有以下几种: 1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据; 2.集合类中有对对象的引用,使用完后未清空,使得JVM不能回收; 3.代码中存在死循环或循环产生过多...

白志华
2015/12/16
122
0
线程池使用不当导致服务器内存耗尽

最近一个项目上线后,服务器磁盘两三天报一下磁盘100%的异常,开始以为是磁盘问题,因为这个服务器上有一个rsync的定时任务,10分钟一次,用于同步静态文件,大概1万个html文件,正常不到1分...

hellooworld
2016/12/29
0
0
nutch1.7 爬取网页parse问题

执行命令 bin/nutch crawl urls -dir tmpData -threads 50 -depth 2 nutch-site.xml配置: 简略报错信息: hadoop.log日志文件里的报错信息: 报错所指源码部分一: 报错所指源码部分二: 网...

leave00608
2014/03/10
861
2
hadoop2.7集群,新增datanode节点后报错的解决思路

我们的hadoop是2.7版本的,取得当时最新的版本,唉,不稳定呀,中间波折好多。 当前集群是1个namenode,4个datanode。服务器是虚拟机,配置太差,需要增加节点。 悲催的hadoop集群,我同时增...

灵宝
2015/09/14
312
0

没有更多内容

加载失败,请刷新页面

加载更多

Excel数据透视表基础:数据透视表的正确数据格式

1.数据透视表:是一种数据分析方法, 一.使用数据透视表必须用正确的数据格式: 1.数据必须有标题: 2.数据表不能有相同的标题 3.数据表中不能有合并单元格 4.不能有 小计、合计、空行、分类...

东方墨天
27分钟前
9
0
聊聊nacos的NacosDiscoveryAutoConfiguration

序 本文主要研究一下nacos的NacosDiscoveryAutoConfiguration NacosDiscoveryAutoConfiguration nacos-spring-boot-project/nacos-discovery-spring-boot-autoconfigure/src/main/java/com/a......

go4it
今天
10
0
如何保证消息的顺序性?

面试题 如何保证消息的顺序性? 面试官心理分析 其实这个也是用 MQ 的时候必问的话题,第一看看你了不了解顺序这个事儿?第二看看你有没有办法保证消息是有顺序的?这是生产系统中常见的问题...

米兜
今天
18
0
网络安全市场需求

最近,网络安全技能差距的热门话题流传开来。技能差距经常被紧急讨论,可以看出它在实践中的作用是很大的。但信息安全是一门广泛的学科,所以在谈论“技能差距”时需要更具体。有专家表示,真...

linuxCool
今天
12
0
饿了么快应用初体验

作者:饿了么 顾诚 为什么我们选择了快应用 在很长一段时间里,原生饿了么应用对于新用户来说体验成本略高,对于迫切想要点餐的老用户操作有点繁琐;而 Web 版的饿了么应用在体验、速度、功能...

前端老手
今天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部