亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java虛擬機最多支持多少個線程的探討

 更新時間:2014年04月17日 09:04:01   作者:  
這篇文章主要介紹了Java虛擬機最多支持多少個線程的問題,從StackOverflow上摘錄而來,需要的朋友可以參考下

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

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


Eddie的回答:

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

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

當然了,你要有足夠的本機內(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程序:

復(fù)制代碼 代碼如下:

class DieLikeADog {
      public static void main(String[] argv){
          for(;;){
             new Thread(new SomeRunaable).start();
          }
      }
 }

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

升級版

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

復(fù)制代碼 代碼如下:
public class DieLikeADog {
    private static Object s = new Object();
    private static int count = 0;
    public static void main(String[] argv){
        for(;;){
            new Thread(new Runnable(){
                    public void run(){
                        synchronized(s){
                            count += 1;
                            System.err.println("New thread #"+count);
                        }
                        for(;;){
                            try {
                                Thread.sleep(1000);
                            } catch (Exception e){
                                System.err.println(e);
                            }
                        }
                    }
                }).start();
        }
    }
}

在Intel的OS/X 10.5.6系統(tǒng)上,Java 5的輸出如下:
復(fù)制代碼 代碼如下:

New thread #2547
New thread #2548
New thread #2549
Can't create thread: 5
New thread #2550
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:592)
        at DieLikeADog.main(DieLikeADog.java:6)

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é)果:

復(fù)制代碼 代碼如下:
2 mb --> 5744 threads
4 mb --> 5743 threads
8 mb --> 5735 threads
12 mb --> 5724 threads
16 mb --> 5712 threads
24 mb --> 5687 threads
32 mb --> 5662 threads
48 mb --> 5610 threads
64 mb --> 5561 threads
96 mb --> 5457 threads
128 mb --> 5357 threads
192 mb --> 5190 threads
256 mb --> 5014 threads
384 mb --> 4606 threads
512 mb --> 4202 threads
768 mb --> 3388 threads
1024 mb --> 2583 threads

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

Neil Coffey的回答:

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

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

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

相關(guān)文章

  • @SpringBootTest 注解報紅問題及解決

    @SpringBootTest 注解報紅問題及解決

    這篇文章主要介紹了@SpringBootTest 注解報紅問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java 十大排序算法之堆排序刨析

    Java 十大排序算法之堆排序刨析

    堆排序是利用堆這種數(shù)據(jù)結(jié)構(gòu)而設(shè)計的一種排序算法,堆排序是一種選擇排序,它的最壞,最好,平均時間復(fù)雜度均為O(nlogn),它也是不穩(wěn)定排序。首先簡單了解下堆結(jié)構(gòu)
    2021-11-11
  • Java線程中的interrupt方法解讀

    Java線程中的interrupt方法解讀

    這篇文章主要介紹了Java線程中的interrupt方法解讀,Java中的interrupt是一種線程間通信的機制,用于請求中斷線程的執(zhí)行。當一個線程調(diào)用另一個線程的interrupt()方法時,被調(diào)用線程會收到一個中斷信號,可以根據(jù)需要做出相應(yīng)的處理,需要的朋友可以參考下
    2023-10-10
  • 解決java.util.NoSuchElementException異常的問題

    解決java.util.NoSuchElementException異常的問題

    這篇文章主要介紹了解決java.util.NoSuchElementException異常的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • 詳解JVM類加載機制及類緩存問題的處理方法

    詳解JVM類加載機制及類緩存問題的處理方法

    這篇文章主要給大家介紹了關(guān)于JVM類加載機制及類緩存問題的處理方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • java模擬post請求登錄貓撲示例分享

    java模擬post請求登錄貓撲示例分享

    這篇文章主要介紹了java模擬post請求登錄貓撲的小示例,需要的朋友可以參考下
    2014-02-02
  • springboot中如何判斷某個bean是否存在

    springboot中如何判斷某個bean是否存在

    這篇文章主要介紹了springboot中如何判斷某個bean是否存在,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • @PathVariable注解,讓spring支持參數(shù)帶值功能的案例

    @PathVariable注解,讓spring支持參數(shù)帶值功能的案例

    這篇文章主要介紹了@PathVariable注解,讓spring支持參數(shù)帶值功能的案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • 如何用java編寫一個rmi

    如何用java編寫一個rmi

    RMI能讓一個Java程序去調(diào)用網(wǎng)絡(luò)中另一臺計算機的Java對象的方法,那么調(diào)用的效果就像是在本機上調(diào)用一樣。下面我們來詳細了解一下吧
    2019-06-06
  • Spring-data-redis操作redis知識總結(jié)

    Spring-data-redis操作redis知識總結(jié)

    這篇文章主要介紹了Spring-data-redis操作redis知識總結(jié),spring-data-redis是spring-data模塊的一部分,專門用來支持在spring管理項目對redis的操作。
    2017-04-04

最新評論