一台Java服务器启动多少线程,性能最佳呢?

createh51个月前 (02-01)技术教程17

一台Java服务器能跑多少个线程?这个问题来自一次线上报警如下图,超过了我们的配置阈值。

打出jstack文件,通过IBM Thread and Monitor Dump Analyzer for Java工具查看如下:

共计1661个线程,和监控数据得出的吻合。但这个数量应该是大了,我们都知道线程多了,就会有线程切换,带来性能开销。

当时就想到一台Java服务器到底可以跑多少个线程呢?跟什么有关系?现整理如下。

每个线程都有一个线程栈空间通过-Xss设置,查了一下我们服务器的关于jvm内存的配置

`-Xms4096m`
`-Xmx4096m`
`-XX:MaxPermSize=1024m`

只有这三个,并没有-Xss 和-XX:ThreadStackSize的配置,因此是走的默认值。

可以通过如下命令打印输出默认值的大小,命令:

`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,里面可以针对每个服务端口设置线程大小。


来源
:https://www.jianshu.com/p/807b9cf9fb3e

相关文章

给32位系统装8g内存条能用吗?为什么?

关于32位和64位,这个概念一直让人比较懵。在买电脑的时候,我们看到过32位和64位CPU。下软件的时候,我们也看到过32位或64位的软件。就连装虚拟机的时候,我们也看过32位和64位的系统。在写代码...

JDK 17 - Java 17 的新特性速览(jdk17 lts)

JDK 17 于 8 月 5 日进入候选发布阶段,最终候选版本将于 8 月 19 日发布。所有功能/JEP 集都被冻结以进行目标发布。有 10 个新功能 + 2 个功能删除 + 2 个功能弃用,还有...

二 JAVA语言基础之 基本数据类型(java的基本数据类型有哪些并简单叙述)

前面我们搭建了JAVA的开发环境和开发工具,今天我们正式进入JAVA基础语法的学习。首先认知下JAVA的八大基本类型:Java中主要有八种基本数据类型:1、整型:byte、short、int、long...

深入了解SHA-256算法及其Java实现

SHA-256(Secure Hash Algorithm 256-bit)是在日常开发中比较常见的一种加密哈希函数算法,属于SHA-2(Secure Hash Algorithm 2)系列,其输出结...

32位已死,对安卓和苹果意味着什么?

Arm宣布,从2023年起,其所有新智能手机CPU内核都将仅为64位,且没有32位兼容模式。2013年,苹果就在iPhone 5s中使用了64位A7处理器,我们开始拥有支持64位的智能手机处理器。不久...

Java和C++区别(java和c区别大吗)

Java和C++都是面向对象语言。也就是说,它们都能实现面向对象思想(封装、继承、多态)。而由于C++为了照顾大量C语言使用者,而兼容了C,使得自身成为带类的C语言,多多少少影响了其面向对象的彻底性!...