java 线程数_在虚拟机中是什么限制java线程数量?这方面涉及哪些调优?
首先要說明一點,Java線程的實現是基于底層系統的線程機制來實現的,程序中開的線程并不全部取決于JVM虛擬機棧,而是取決于CPU,操作系統,其他進程,Java的版本。JVM的線程與計算機本身性能相關。
以前寫過一個例子,統計可以開辟的線程數量,通過不斷的申請Thread,最終會報錯,輸出一個當前開辟線程的數量:
public class ThreadCount{
private static Object obj = new Object();
private static int count = 0;
public static void main(String[] args){
for(;;){
new Thread(new Runnable(){
public void run(){
synchronized(obj){
count += 1;
System.out.println("Thread #"+count);
}
for(;;){
try {
Thread.sleep(1000);
} catch (Exception e){
System.err.println(e);
}
}
}
}).start();
}
}
}
運行結果上傳圖片有點問題,結果就不貼了,每個人的機器,結果都是不同的,可以運行下。
既然線程數量于計算機本身相關,我們是不是不可調控,是固定的呢?
答案顯然不是的,在不考慮系統本身限制的情況下,主要跟JVM一下幾點有關:-Xms 初始堆大小 (在實際生產中,一般把-Xms和-Xmx設置成一樣的。)
-Xmx 最大堆大小
-Xss 每個線程棧大小
結論1:當給JVM的堆內存分配的越大,系統可創建的線程數量就越少(可以通過上面測試程序,不斷的改變-Xmx,-Xms的值,觀看最后異常時的線程數量)。這個如何理解呢?很簡單,因為線程占用的是系統空間,所以當JVM的堆內存越大,系統本身的內存就越少,自然可生成的線程數量就越少。
結論2:當-Xss的的值越小,可生成的線程數量就越多。(一樣可以通過上面測試,保持-Xmx,-Xms不變,改變-Xss的值,jdk5以下默認好像是256K,以上默認為1M,具體記不太清楚了)。這個理解也很簡單,線程可用空間保持不變,每個線程占用的棧內存大小變小,自然可生成的線程數量就越多。
那么是不是不斷加大可用內存,線程數量也會不斷增長呢?
這個當然不是,上面我特意加粗了不考慮系統本省限制的情況,所以說線程數量還與系統限制有關。主要跟一下幾個參數有關(Linux下的):/proc/sys/kernel/pid_max 增大,線程數量增大,pid_max有最高值,超過之后不再改變,而且32,64位也不一樣
/proc/sys/kernel/thread-max 系統可以生成最大線程數量
max_user_process(ulimit -u)centos系統上才有,沒有具體研究
/proc/sys/vm/max_map_count 增大,數量增多
總結:線程最大數量由JVM的堆(-Xmx,-Xms)大小、Thread的棧(-Xss)內存大小、系統最大可創建的線程數的限制參數三個方面影響。不考慮系統限制,可以通過這個公式估算:
線程數量 = (機器本身可用內存 - JVM分配的堆內存) / Xss的值。
以上均為個人觀點,有錯誤的還請指正,請勿噴,和諧,和諧。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的java 线程数_在虚拟机中是什么限制java线程数量?这方面涉及哪些调优?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深度linux支持安卓,深度操作系统 V
- 下一篇: mysql人事管理系统源代码_人事管理系