一台java服务器能跑多少个线程?这个问题来自一次线上报警以下图,超过了咱们的配置阈值。java
打出jstack文件,经过IBM Thread and Monitor Dump Analyzer for Java工具查看以下:centos
共计1661个线程,和监控数据得出的吻合。但这个数量应该是大了,咱们都知道线程多了,就会有线程切换,带来性能开销。服务器
当时就想到一台java服务器到底能够跑多少个线程呢?跟什么有关系?现整理以下。框架
每一个线程都有一个线程栈空间经过-Xss设置,查了一下咱们服务器的关于jvm内存的配置jvm
-Xms4096m工具
-Xmx4096m性能
-XX:MaxPermSize=1024m操作系统
只有这三个,并无-Xss 和-XX:ThreadStackSize的配置,所以是走的默认值。几种JVM的默认栈大小线程
能够经过以下命令打印输出默认值的大小,命令:jinfo -flag ThreadStackSize ;例如orm
[root@host-192-168-202-229 ~]#jinfo -flag ThreadStackSize 1807
-XX:ThreadStackSize=1024
不考虑系统限制,能够经过以下公式计算,得出最大线程数量
线程数量=(机器自己可用内存-JVM分配的堆内存)/Xss的值,好比咱们的容器自己大小是8G,堆大小是4096M,走-Xss默认值,能够得出 最大线程数量:4096个。
根据计算公式,得出以下结论:
结论1:jvm堆越大,系统建立的线程数量越小。
结论2:当-Xss的值越小,可生成线程数量越多。
咱们知道操做系统分配给每一个进程的内存大小是有限制的,好比32位的Windows是2G。所以操做系统对一个进程下的线程数量是有限制的,不能无限的增多。经验值:3000-5000左右(我没有验证)。
刚才说的是不考虑系统限制的状况,那若是考虑系统限制呢,主要跟如下几个参数有关系
/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 增大,数量增多
线程是很是宝贵的资源,咱们要严格控制线程的数量,象上面咱们的截图状况,显然线程数量过多。这个是跟咱们本身配置了fixed大小的线程池有关系。京东有本身的rpc框架jsf,里面能够针对每一个服务端口设置线程大小。
转载请标明出处,并附上原文连接。遵照行业道德。
连接:https://www.jianshu.com/p/f1930596947d