"unable to create new native thread"--多线程常见问题

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 java.util.concurrent.ThreadPoolExecutor.addWorker(ThreadPoolExecutor.java:950)
    at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1368)
    at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:112)
    at com.wenniuwuren.concurrent.newCachedThreadPoolTest.main(newCachedThreadPoolTest.java:15)
    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:140)

业务开发过程中, 比如说我们要实现一个功能, 但是该功能需要调用其他系统的多个接口做数据组装, 多个被调用接口之间无依赖关系, 按照正常逻辑, 我们可以串行依次调用多个接口, 假如有三个接口, 我们的代码如下:

//伪代码   伪代码  伪代码!  重要的事情说三遍
public Result demo(){
  //调用第一个接口, 耗时1s
  Result  interface1Result = interface1();

 //调用第二个接口, 耗时2s
  Result  interface2Result = interface2();

 //调用第三个接口, 耗时3s
  Result  interface3Result = interface3();

//组装数据
 Result  result = interface1Result + interface2Result +interface3Result;
return result;
}

满足业务需要,没有问题, 当我们考虑性能的时候, 这个接口的最小耗时等于三个接口的耗时之和, 也就是6s, 针对这种情况, 我们想当然的觉得, 可以把串行的接口调用改成并行, 这样的话, 接口响应时间应该提升为3s, 伪代码入下:

ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
//伪代码   伪代码  伪代码!  重要的事情说三遍
public Result demo(){
  //调用第一个接口, 耗时1s
cachedThreadPool.execute(new Runnable() {

@Override
public void run() {
   Result  interface1Result = interface1();
}
});
}

 //调用第二个接口, 耗时2s
cachedThreadPool.execute(new Runnable() {

@Override
public void run() {
  Result  interface2Result = interface2();
}
});
}


 //调用第三个接口, 耗时3s
cachedThreadPool.execute(new Runnable() {

@Override
public void run() {
  Result  interface3Result = interface3();
}
});
}

//组装数据
 Result  result = interface1Result + interface2Result +interface3Result;
return result;
}

这种情况下, 我们使用线程池来并行调用三个接口, 最终响应时间得到了提升, 但是单机的tps在压测的时候, 就会出现我们文章标题的错误, 因为每个方法需要3s的处理时长, 当压力不断增加的时候, 线程池没有可用的线程时, 会一直新建线程, 当超出jvm的栈内存大小时, 就会报出无法再创建线程的错误.

这种情况下, 我们可以使用定长的线程池, 比如估计一个线程池大小, 100, 当无线程可用的时候, 我们就阻塞等待, 这种情况比较稳, 但需要能够比较准确的估算线程池大小, 要不然服务器资源会有一定的浪费, 这不符合我们勤俭持家程序员的风格, 于是下面我们介绍一下, 如何准确的估算线程池的大小:

引自:《Java Concurrency in Practice》即《java并发编程实践》


image.png

如上图,在《Java Concurrency in Practice》一书中,给出了估算线程池大小的公式:

Nthreads=Ncpu*Ucpu*(1+w/c),其中

Ncpu=CPU核心数

Ucpu=cpu使用率,0~1

W/C=等待时间与计算时间的比率

比如说, 服务器cpu为32核, 一般cpu使用到80%会引起系统告警, 等待时间估计为 0.2s, 计算时间为 0.1s,
针对这种情况:

  Nthreads=32*0.8*(1+0.2/0.1) = 76.8

所以我们就设置线程池大小为 75 就ok了

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容

  • 下面是我自己收集整理的Java线程相关的面试题,可以用它来好好准备面试。 参考文档:-《Java核心技术 卷一》-...
    阿呆变Geek阅读 14,735评论 14 507
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,169评论 11 349
  • 他写半朽的诗 昨日就被埋葬的诗。 难以捉摸 是某个末日,群山如梦跳转不已。 虹霓触电,困在边界的城市 震颤崩解。 ...
    没缸阅读 229评论 0 0
  • 文|张涔汐 她那时候太年轻,不知道所有命运赠送的礼物,早已在暗中标好了价格。——茨威格 壹 昨天一个好友跟我抱怨被...
    张涔汐阅读 882评论 1 11
  • 房间内,琉璃忐忑的看看上官玉清和墨玉桓,定了定神,终于一狠心,眼一闭,嘴一张,就吞下了上官玉清苦心为自己提炼的的“...
    记搏阅读 711评论 0 4