<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Java 最多支持多少個線程,你思考過嗎?

          共 1693字,需瀏覽 4分鐘

           ·

          2020-09-01 05:45

          來源:importnew.com/10780.html

          • Eddie的回答:
          • Charlie Martin的回答:
          • benjismith的回答:
          • Neil Coffey的回答:

          McGovernTheory在StackOverflow提了這樣一個問題:

          Java虛擬機最多支持多少個線程?跟虛擬機開發(fā)商有關(guān)么?跟操作系統(tǒng)呢?還有其他的因素嗎?

          Eddie的回答:

          這取決于你使用的CPU,操作系統(tǒng),其他進程正在做的事情,你使用的Java的版本,還有其他的因素。我曾經(jīng)見過一臺Windows服務(wù)器在宕機之前有超過6500個線程。當(dāng)然,大多數(shù)線程什么事情也沒有做。一旦一臺機器上有差不多6500個線程(Java里面),機器就會開始出問題,并變得不穩(wěn)定。

          以我的經(jīng)驗來看,JVM容納的線程與計算機本身性能是正相關(guān)的。

          當(dāng)然了,你要有足夠的本機內(nèi)存,并且給Java分配了足夠的內(nèi)存,讓每個線程都可以擁有棧(虛擬機棧),可以做任何想做的事情。任何一臺擁有現(xiàn)代CPU(AMD或者是Intel最近的幾代)和1-2G內(nèi)存(取決于操作系統(tǒng))的機器很容易就可以支持有上千個線程的Java虛擬機。

          如果你需要一個更精確的答案,最好是自己做壓測。

          Charlie Martin的回答:

          這里有很多的參數(shù)(可以設(shè)置)。對于特定的虛擬機,都會有自己的運行時參數(shù)。(最大線程數(shù))一定程度上由操作系統(tǒng)決定的:底層的操作系統(tǒng)要給線程提供哪些支持?施加哪些限制?虛擬機使用的是原生的操作系統(tǒng)的線程還是red thread或者green thread?

          操作系統(tǒng)提供的支持是另一個問題。如果你向下面這樣寫Java程序:

          img

          (不要抱怨語法細(xì)節(jié),這才剛剛開始)那你當(dāng)然希望能得到成百上千個運行的線程。但是,創(chuàng)建一個線程的成本是相對較大的,(過多線程)調(diào)度的開銷會變得突出。能否讓這些線程做有用的事情還不確定。

          升級版

          好了,迫不及待了!下面是我的一個加了點潤色的小的測試程序:

          img

          在Intel的OS/X 10.5.6系統(tǒng)上,Java 5的輸出如下:

          img

          benjismith的回答:

          讀了Charlie Martin的回復(fù)以后,我很想知道堆內(nèi)存的大小是否能夠給創(chuàng)建的線程數(shù)帶來不同,然后我就被結(jié)果驚呆了:在Vista Home Premium SP1系統(tǒng)上,使用JDK 1.6.0_11,設(shè)置堆內(nèi)存的大小從2M到1024M來執(zhí)行Charlie的測試程序。比如:創(chuàng)建2M的堆內(nèi)存,我使用的虛擬機參數(shù)是:-Xms2m -Xmx2m.

          下面是我的測試結(jié)果:

          img

          所以,堆的大小確實很重要。但是,堆大小和最大線程數(shù)卻是呈反比例關(guān)系。這太詭異了!

          Neil Coffey的回答:

          絕對理論上的最大線程數(shù)是進程的用戶地址空間除以線程棧的大小(現(xiàn)實中,如果內(nèi)存全部給線程棧使用,就不會有能運行的程序了)。因此,以32位Windows系統(tǒng)為例,每一個進程的用戶地址空間是2G,假如每個線程棧的大小是128K,最多會有16384(=210241024 / 128)個線程。實際在XP系統(tǒng)上,我發(fā)現(xiàn)大約能啟動13000個線程。

          然后,我認(rèn)為,你的問題本質(zhì)上是:(a)你是否可以在你的代碼中有效的管理許多的線程,不讓他們做很顯然是愚蠢的事情(比如:讓他們在同一個object對象上等待隨后被調(diào)用notifyAll()…),(b)操作系統(tǒng)是否可以有效地管理這許多線程。基本上來說,如果(a)的答案是”yes”的話,(b)的答案也是”yes”。

          很巧的是,你可以在Thread的構(gòu)造函數(shù)中設(shè)置線程棧的大小,但是,你不需要也不應(yīng)該把這個和虛擬機參數(shù)弄混淆。

          - 推薦閱讀 -


          架構(gòu)師離職后,成為自由開發(fā)者的第 100 天


          下方二維碼關(guān)注我

          互聯(lián)網(wǎng)草根,堅持分享技術(shù)創(chuàng)業(yè)產(chǎn)品心得和總結(jié)~



          點擊“閱讀原文”,領(lǐng)取 2020 年最新免費技術(shù)資料大全

          ↓↓↓?
          瀏覽 69
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  中日韩无码视频 | 天天射日 | a在线观看免费 | porncao1 | 国产精品色综合 |