首先要说明一点,Java线程的实现是基于底层系统的线程机制来实现的,程序中开的线程并不所有取决于JVM虚拟机栈,而是取决于CPU,操做系统,其余进程,Java的版本。JVM的线程与计算机自己性能相关。centos
之前写过一个例子,统计能够开辟的线程数量,经过不断的申请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一下几点有关:线程
结论1:当给JVM的堆内存分配的越大,系统可建立的线程数量就越少(能够经过上面测试程序,不断的改变-Xmx,-Xms的值,观看最后异常时的线程数量)。这个如何理解呢?很简单,由于线程占用的是系统空间,因此当JVM的堆内存越大,系统自己的内存就越少,天然可生成的线程数量就越少。code
结论2:当-Xss的的值越小,可生成的线程数量就越多。(同样能够经过上面测试,保持-Xmx,-Xms不变,改变-Xss的值,jdk5如下默认好像是256K,以上默认为1M,具体记不太清楚了)。这个理解也很简单,线程可用空间保持不变,每一个线程占用的栈内存大小变小,天然可生成的线程数量就越多。进程
那么是否是不断加大可用内存,线程数量也会不断增加呢?图片
这个固然不是,上面我特地加粗了不考虑系统本省限制的状况,因此说线程数量还与系统限制有关。主要跟一下几个参数有关(Linux下的):内存
总结:线程最大数量由JVM的堆(-Xmx,-Xms)大小、Thread的栈(-Xss)内存大小、系统最大可建立的线程数的限制参数三个方面影响。不考虑系统限制,能够经过这个公式估算:虚拟机
线程数量 = (机器自己可用内存 - JVM分配的堆内存) / Xss的值。
做者:Elliot 连接:https://www.zhihu.com/question/45563937/answer/99495011 来源:知乎 著做权归做者全部。商业转载请联系做者得到受权,非商业转载请注明出处。