84669 人學習
152542 人學習
20005 人學習
5487 人學習
7821 人學習
359900 人學習
3350 人學習
180660 人學習
48569 人學習
18603 人學習
40936 人學習
1549 人學習
1183 人學習
32909 人學習
在Java中,如果每当一个请求到达就创建一个新线程,开销是相当大的。在实际使用中,每个请求创建新线程的服务器在创建和销毁线程上花费的时间和消耗的系统资源,甚至可能要比花在实际处理实际的用户请求的时间和资源要多的多。
那么问题来了,创建一个线程到底要有哪些开销?各个开销耗时多么?哪个开销最耗时?
走同样的路,发现不同的人生
通常是 pthread_create
pthread_create
關於時間,創建線程使用是直接向系統申請資源的,這裡調用系統函數進行分配資源的話耗時不好說。 關於資源,Java執行緒的執行緒棧所佔用的記憶體是在Java堆外的,所以是不受java程式控制的,只受系統資源限制,預設一個執行緒的執行緒棧大小是1M(當讓這個可以通過設定-Xss屬性設置,但是要注意棧溢出問題),但是,如果每個用戶請求都新建線程的話,1024個用戶光線程就佔用了1個G的內存,如果系統比較大的話,一下子系統資源就不夠用了,最後程式就崩潰了。
-Xss
PS:同樣的道理在java程式中也不要隨意開啟新的線程,特別是高頻業務盡量使用線程池,不然很容易導致記憶體不足,程式崩潰的問題。
對作業系統來說,創建一個線程的代價是十分昂貴的, 需要給它分配內存、列入調度,同時在線程切換的時候還要執行內存換頁,CPU 的緩存被清空,切換回來的時候也要重新從記憶體中讀取資訊,破壞了資料的局部性。
通常是
pthread_create
關於時間,創建線程使用是直接向系統申請資源的,這裡調用系統函數進行分配資源的話耗時不好說。
關於資源,Java執行緒的執行緒棧所佔用的記憶體是在Java堆外的,所以是不受java程式控制的,只受系統資源限制,預設一個執行緒的執行緒棧大小是1M(當讓這個可以通過設定
-Xss
屬性設置,但是要注意棧溢出問題),但是,如果每個用戶請求都新建線程的話,1024個用戶光線程就佔用了1個G的內存,如果系統比較大的話,一下子系統資源就不夠用了,最後程式就崩潰了。PS:同樣的道理在java程式中也不要隨意開啟新的線程,特別是高頻業務盡量使用線程池,不然很容易導致記憶體不足,程式崩潰的問題。
對作業系統來說,創建一個線程的代價是十分昂貴的, 需要給它分配內存、列入調度,同時在線程切換的時候還要執行內存換頁,CPU 的緩存被清空,切換回來的時候也要重新從記憶體中讀取資訊,破壞了資料的局部性。