java 线程数_在虚拟机中是什么限制java线程数量?这方面涉及哪些调优?
首先要說(shuō)明一點(diǎn),Java線程的實(shí)現(xiàn)是基于底層系統(tǒng)的線程機(jī)制來(lái)實(shí)現(xiàn)的,程序中開(kāi)的線程并不全部取決于JVM虛擬機(jī)棧,而是取決于CPU,操作系統(tǒng),其他進(jìn)程,Java的版本。JVM的線程與計(jì)算機(jī)本身性能相關(guān)。
以前寫過(guò)一個(gè)例子,統(tǒng)計(jì)可以開(kāi)辟的線程數(shù)量,通過(guò)不斷的申請(qǐng)Thread,最終會(huì)報(bào)錯(cuò),輸出一個(gè)當(dāng)前開(kāi)辟線程的數(shù)量:
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();
}
}
}
運(yùn)行結(jié)果上傳圖片有點(diǎn)問(wèn)題,結(jié)果就不貼了,每個(gè)人的機(jī)器,結(jié)果都是不同的,可以運(yùn)行下。
既然線程數(shù)量于計(jì)算機(jī)本身相關(guān),我們是不是不可調(diào)控,是固定的呢?
答案顯然不是的,在不考慮系統(tǒng)本身限制的情況下,主要跟JVM一下幾點(diǎn)有關(guān):-Xms 初始堆大小 (在實(shí)際生產(chǎn)中,一般把-Xms和-Xmx設(shè)置成一樣的。)
-Xmx 最大堆大小
-Xss 每個(gè)線程棧大小
結(jié)論1:當(dāng)給JVM的堆內(nèi)存分配的越大,系統(tǒng)可創(chuàng)建的線程數(shù)量就越少(可以通過(guò)上面測(cè)試程序,不斷的改變-Xmx,-Xms的值,觀看最后異常時(shí)的線程數(shù)量)。這個(gè)如何理解呢?很簡(jiǎn)單,因?yàn)榫€程占用的是系統(tǒng)空間,所以當(dāng)JVM的堆內(nèi)存越大,系統(tǒng)本身的內(nèi)存就越少,自然可生成的線程數(shù)量就越少。
結(jié)論2:當(dāng)-Xss的的值越小,可生成的線程數(shù)量就越多。(一樣可以通過(guò)上面測(cè)試,保持-Xmx,-Xms不變,改變-Xss的值,jdk5以下默認(rèn)好像是256K,以上默認(rèn)為1M,具體記不太清楚了)。這個(gè)理解也很簡(jiǎn)單,線程可用空間保持不變,每個(gè)線程占用的棧內(nèi)存大小變小,自然可生成的線程數(shù)量就越多。
那么是不是不斷加大可用內(nèi)存,線程數(shù)量也會(huì)不斷增長(zhǎng)呢?
這個(gè)當(dāng)然不是,上面我特意加粗了不考慮系統(tǒng)本省限制的情況,所以說(shuō)線程數(shù)量還與系統(tǒng)限制有關(guān)。主要跟一下幾個(gè)參數(shù)有關(guān)(Linux下的):/proc/sys/kernel/pid_max 增大,線程數(shù)量增大,pid_max有最高值,超過(guò)之后不再改變,而且32,64位也不一樣
/proc/sys/kernel/thread-max 系統(tǒng)可以生成最大線程數(shù)量
max_user_process(ulimit -u)centos系統(tǒng)上才有,沒(méi)有具體研究
/proc/sys/vm/max_map_count 增大,數(shù)量增多
總結(jié):線程最大數(shù)量由JVM的堆(-Xmx,-Xms)大小、Thread的棧(-Xss)內(nèi)存大小、系統(tǒng)最大可創(chuàng)建的線程數(shù)的限制參數(shù)三個(gè)方面影響。不考慮系統(tǒng)限制,可以通過(guò)這個(gè)公式估算:
線程數(shù)量 = (機(jī)器本身可用內(nèi)存 - JVM分配的堆內(nèi)存) / Xss的值。
以上均為個(gè)人觀點(diǎn),有錯(cuò)誤的還請(qǐng)指正,請(qǐng)勿噴,和諧,和諧。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的java 线程数_在虚拟机中是什么限制java线程数量?这方面涉及哪些调优?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 深度linux支持安卓,深度操作系统 V
- 下一篇: 依赖第三方库时出现的问题:Manifes