一台 Java 服务器可以跑多少个线程?

createh53个月前 (01-23)技术教程39
作者:新栋BOOK
来源:www.jianshu.com/p/f1930596947d

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

相关文章

图文详解Java对象内存布局(java 对象内存大小)

作为一名Java程序员,我们在日常工作中使用这款面向对象的编程语言时,做的最频繁的操作大概就是去创建一个个的对象了。对象的创建方式虽然有很多,可以通过new、反射、clone、反序列化等不同方式来创建...

35个可以提高千倍效率的Java代码小技巧

代码优化 ,一个很重要的课题。可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没用,但是...

Java-对象到底占多少个字节?计算规则是什么?

JAVA对象模型我们先了解一下,一个JAVA对象的存储结构。在Hotspot虚拟机中,对象在内存中的存储布局分为 3 块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(...

Android L 64位模拟器终于来了:x86独享

Google I/O 2014大会已经过去了很久,64位的Android L依然停留在纸面上,但现在至少可以让开发者们先行品尝品尝了:64位的Android L模拟器已经发布。这次公布的模拟器镜像是专...

Java开发环境搭建(Java开发环境搭建及配置实验的步骤图)

手把手教你Java开发环境搭建JDK下载安装:JDK8(主流)→安装地址①在我的电脑属性查看电脑版本(32or64位)②选择对应版本下载(下载需要注册Oracle账号③双击安装JDK(记住自己的安装路...

在Windows 10下搭建Java环境(使用jdk-13.0.1)

一、初识JDK、JRE和JVM对于使用Java语言的开发者来说,在安装开发工具(Eclipse等)之前首先需要安装JDK(Java Development Kit,Java开发工具包)。它是整个JAV...