一台Java服务器能跑多少个线程?
这个问题来自一次线上报警如下图,超过了我们的配置阈值。
京东自研UMP监控分析
打出jstack文件,通过IBM Thread and Monitor Dump Analyzer for Java工具查看如下:
IBM Thread and Monitor Dump Analyzer for Java 共计1661个线程,和监控数据得出的吻合。
但这个数量应该是大了,我们都知道线程多了,就会有线程切换,带来性能开销。
当时就想到一台java服务器到底可以跑多少个线程呢?跟什么有关系?现整理如下。
每个线程都有一个线程栈空间通过-Xss设置,查了一下我们服务器的关于jvm内存的配置。
-Xms4096m
-Xmx4096m
-XX:MaxPermSize=1024m
只有这三个,并没有-Xss 和-XX:ThreadStackSize的配置,因此是走的默认值。几种JVM的默认栈大小
可以通过如下命令打印输出默认值的大小,命令:jinfo -flag ThreadStackSize  ;例如
[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,里面可以针对每个服务端口设置线程大小。

作者:新栋BOOK

来源:www.jianshu.com/p/f1930596947d

- END -
推荐阅读:

关注Java技术栈公众号在后台回复:Java,可获取一份栈长整理的最新Java 技术干货。

点击「阅读原文」和栈长学更多~

最新文章

  1. 泛函编程(13)-无穷数据流-Infinite Stream
  2. html5,表格与框架综合布局
  3. 嵌入式linux
  4. 韩系高端PK:whoo后VS雪花秀(转载)
  5. light oj 1140 - How Many Zeroes? 数位DP
  6. 【Qt】QWidget、QDialog、QMainWindow的异同点【转】
  7. Exploring the 7 Different Types of Data Stories
  8. ktv
  9. 百练2755 奇妙的口袋 【深搜】or【动规】or【普通递归】or【递推】
  10. spring异常记录-----java.lang.NoClassDefFoundError: org/apache/commons/lang3/StringUtils
  11. nmap安装过程
  12. Qt 创建一个QtDesinger第三方控件
  13. http-server让你在任何目录下都可以创建web服务
  14. 使用 IncrediBuild 提升 VisualStudio 编译速度
  15. Oralce安装、使用过程中出现的问题
  16. 最常出现的字符串 Most Common Word
  17. 8: springMVC ModelAndView 作用与功能解析
  18. Splash jsfunc() 方法
  19. TensorFlow入门(四) name / variable_scope 的使
  20. 使用nmonchart把.nmon文件转换成html

热门文章

  1. ELEMENT-UI 封装el-table 局部刷新row
  2. Nowcoder Sum of Maximum ( 容斥原理 && 拉格朗日插值法 )
  3. luoguP3203 [HNOI2010]BOUNCE 弹飞绵羊
  4. unittest详解(一) unittest初识
  5. 02.替换空格 (Java)
  6. Java中for each与正常for循环效率对比
  7. C# 判断两条直线是否相交
  8. 使用bloomfilter
  9. Emacs Python 自动补全之 eglot
  10. 为解决Thymeleaf数字格式化问题而想到的几种方案