日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2024/1/23 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 解决 - java.lang.OutOfMemoryError: unable to create new native thread 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、認識問題:

首先我們通過下面這個?測試程序?來認識這個問題:
運行的環境?(有必要說明一下,不同環境會有不同的結果):32位 Windows XP,Sun JDK 1.6.0_18, eclipse 3.4,
測試程序:

Java代碼?

?

  • 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參數,eclipse中直接運行輸出,看到了這位朋友了吧:
    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)

    ?

    二、分析問題:

    這個異常問題本質原因是我們創建了太多的線程,而能創建的線程數是有限制的,導致了異常的發生。能創建的線程數的具體計算公式如下:?
    (MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = Number of threads?
    MaxProcessMemory 指的是一個進程的最大內存
    JVMMemory???????? JVM內存
    ReservedOsMemory? 保留的操作系統內存
    ThreadStackSize????? 線程棧的大小

    在java語言里, 當你創建一個線程的時候,虛擬機會在JVM內存創建一個Thread對象同時創建一個操作系統線程,而這個系統線程的內存用的不是JVMMemory,而是系統中剩下的內存(MaxProcessMemory - JVMMemory - ReservedOsMemory)。?


    結合上面例子我們來對公式說明一下:?
    MaxProcessMemory 在32位的 windows下是 2G
    JVMMemory?? eclipse默認啟動的程序內存是64M
    ReservedOsMemory? 一般是130M左右
    ThreadStackSize 32位 JDK 1.6默認的stacksize 325K左右
    公式如下:
    (2*1024*1024-64*1024-130*1024)/325 = 5841?
    公式計算所得5841,和實踐5602基本一致(有偏差是因為ReservedOsMemory不能很精確)?

    由公式得出結論:你給JVM內存越多,那么你能創建的線程越少,越容易發生java.lang.OutOfMemoryError: unable to create new native thread。?

    咦,有點背我們的常理,恩,讓我們來驗證一下,依舊使用上面的測試程序,加上下面的JVM參數,測試結果如下:?
    ThreadStackSize????? JVMMemory??????????????????? 能創建的線程數
    默認的325K???????????? -Xms1024m -Xmx1024m??? i = 2655
    默認的325K?????????????? -Xms1224m -Xmx1224m??? i = 2072
    默認的325K???????????? -Xms1324m -Xmx1324m??? i = 1753
    默認的325K???????????? -Xms1424m -Xmx1424m??? i = 1435
    -Xss1024k???????????? -Xms1424m -Xmx1424m??? i = 452?
    完全和公式一致。?

    三、解決問題:?
    1, 如果程序中有bug,導致創建大量不需要的線程或者線程沒有及時回收,那么必須解決這個bug,修改參數是不能解決問題的。
    2, 如果程序確實需要大量的線程,現有的設置不能達到要求,那么可以通過修改MaxProcessMemory,JVMMemory,ThreadStackSize這三個因素,來增加能創建的線程數:
    a, MaxProcessMemory 使用64位操作系統
    b, JVMMemory?? 減少JVMMemory的分配
    c, ThreadStackSize? 減小單個線程的棧大小

    總結

    以上是生活随笔為你收集整理的解决 - java.lang.OutOfMemoryError: unable to create new native thread的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。