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

工作中碰到過(guò)這個(gè)問題好幾次了,覺得有必要總結(jié)一下,所以有了這篇文章夺艰,這篇文章分為三個(gè)部分:認(rèn)識(shí)問題、分析問題沉衣、解決問題郁副。

認(rèn)識(shí)問題##

首先我們通過(guò)下面這個(gè) 測(cè)試程序 來(lái)認(rèn)識(shí)這個(gè)問題。運(yùn)行的環(huán)境 (有必要說(shuō)明一下豌习,不同環(huán)境會(huì)有不同的結(jié)果):32位 Windows XP存谎,Sun JDK 1.6.0_18, eclipse 3.4肥隆,測(cè)試程序:

import java.util.concurrent.CountDownLatch;

public class TestNativeOutOfMemoryError {
    public static void main(String[] args) {
        for (int i = 0;; i++) {
            System.out.println("i = " + i);
            new Thread(new HoldThread()).start();
        }
    }
}

class HoldThread extends Thread {
    CountDownLatch cdl = new CountDownLatch(1);

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

    public void run() {
        try {
            cdl.await();
        } catch (InterruptedException e) {
        }
    }
}

不指定任何JVM參數(shù)既荚,eclipse中直接運(yùn)行輸出,看到了這位朋友了吧:
i = 5602
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:597)
at TestNativeOutOfMemoryError.main(TestNativeOutOfMemoryError.java:20)

分析問題##

這個(gè)異常問題本質(zhì)原因是我們創(chuàng)建了太多的線程栋艳,而能創(chuàng)建的線程數(shù)是有限制的恰聘,導(dǎo)致了異常的發(fā)生。能創(chuàng)建的線程數(shù)的具體計(jì)算公式如下:

// MaxProcessMemory 指的是一個(gè)進(jìn)程的最大內(nèi)存
// JVMMemory JVM內(nèi)存
// ReservedOsMemory 保留的操作系統(tǒng)內(nèi)存
// ThreadStackSize 線程棧的大小
(MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = Number of threads 

在Java語(yǔ)言里,當(dāng)你創(chuàng)建一個(gè)線程的時(shí)候晴叨,虛擬機(jī)會(huì)在JVM內(nèi)存創(chuàng)建一個(gè)Thread對(duì)象同時(shí)創(chuàng)建一個(gè)操作系統(tǒng)線程凿宾,而這個(gè)系統(tǒng)線程的內(nèi)存用的不是JVMMemory,而是系統(tǒng)中剩下的內(nèi)存(MaxProcessMemory - JVMMemory - ReservedOsMemory)兼蕊。

結(jié)合上面例子我們來(lái)對(duì)公式說(shuō)明一下:

MaxProcessMemory 在32位的 windows下是 2G
JVMMemory eclipse默認(rèn)啟動(dòng)的程序內(nèi)存是64M
ReservedOsMemory 一般是130M左右
ThreadStackSize 32位 JDK 1.6 默認(rèn)的stacksize 325K左右

公式如下:

(210241024-641024-1301024)/325 = 5841
公式計(jì)算所得5841菌湃,和實(shí)踐5602基本一致(有偏差是因?yàn)镽eservedOsMemory不能很精確)

由公式得出結(jié)論:

你給JVM內(nèi)存越多,那么你能創(chuàng)建的線程越少遍略,越容易發(fā)生java.lang.OutOfMemoryError: unable to create new native thread。

解決問題##

  1. 如果程序中有bug骤坐,導(dǎo)致創(chuàng)建大量不需要的線程或者線程沒有及時(shí)回收绪杏,那么必須解決這個(gè)bug,修改參數(shù)是不能解決問題的纽绍。
  2. 如果程序確實(shí)需要大量的線程蕾久,現(xiàn)有的設(shè)置不能達(dá)到要求,那么可以通過(guò)修改MaxProcessMemory拌夏,JVMMemory僧著,ThreadStackSize這三個(gè)因素,來(lái)增加能創(chuàng)建的線程數(shù):

(a)MaxProcessMemory 使用64位操作系統(tǒng)障簿。
(b)JVMMemory 減少JVMMemory的分配盹愚。
(c)ThreadStackSize 減小單個(gè)線程的棧大小。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末站故,一起剝皮案震驚了整個(gè)濱河市皆怕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌西篓,老刑警劉巖愈腾,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異岂津,居然都是意外死亡虱黄,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門吮成,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)橱乱,“玉大人,你說(shuō)我怎么就攤上這事赁豆〗龃迹” “怎么了?”我有些...
    開封第一講書人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵魔种,是天一觀的道長(zhǎng)析二。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么叶摄? 我笑而不...
    開封第一講書人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任属韧,我火速辦了婚禮,結(jié)果婚禮上蛤吓,老公的妹妹穿的比我還像新娘宵喂。我一直安慰自己,他們只是感情好会傲,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開白布锅棕。 她就那樣靜靜地躺著,像睡著了一般淌山。 火紅的嫁衣襯著肌膚如雪裸燎。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,624評(píng)論 1 305
  • 那天泼疑,我揣著相機(jī)與錄音德绿,去河邊找鬼。 笑死退渗,一個(gè)胖子當(dāng)著我的面吹牛移稳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播会油,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼个粱,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了钞啸?” 一聲冷哼從身側(cè)響起几蜻,我...
    開封第一講書人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎体斩,沒想到半個(gè)月后梭稚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡絮吵,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年弧烤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蹬敲。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡暇昂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出伴嗡,到底是詐尸還是另有隱情急波,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布瘪校,位于F島的核電站澄暮,受9級(jí)特大地震影響名段,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜泣懊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一伸辟、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧馍刮,春花似錦信夫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至匈辱,卻和暖如春姊扔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背梅誓。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留佛南,地道東北人梗掰。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像嗅回,于是被迫代替她去往敵國(guó)和親及穗。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容