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

Java技术栈

www.javastack.cn

优秀的Java技术公众号

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

这个问题来自一次线上报警如下图,超过了我们的配置阈值。

京东自研UMP监控分析

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

IBM Thread and Monitor Dump Analyzer for Java 共计1661个线程,和监控数据得出的吻合。

但这个数量应该是大了,我们都知道线程多了,就会有线程切换,带来性能开销。

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

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

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

可以通过如下命令打印输出默认值的大小,命令:jinfo -flag ThreadStackSize ;例如

不考虑系统限制,可以通过如下公式计算,得出最大线程数量

线程数量=(机器本身可用内存-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

本文分享自微信公众号 - Java技术栈(javastack)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-10-31

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Android开发小工

写出让java相看两不厌的kotlin代码-@JvmField和@JvmStatic的方法论

在java代码里使用就报错"Non-static cannot be accessed from a static context."

6520
来自专栏码匠的流水账

聊聊nacos的LocalConfigInfoProcessor

nacos-1.1.3/client/src/main/java/com/alibaba/nacos/client/config/impl/LocalConfi...

8020
来自专栏码匠的流水账

聊聊NacosNamingService的subscribe及unsubscribe

本文主要研究一下NacosNamingService的subscribe及unsubscribe

8330
来自专栏武培轩的专栏

JVM类加载过程与双亲委派模型

类加载过程为JVM将类描述数据从.class文件中加载到内存,并对数据进行解析和初始化,最终形成被JVM直接使用的Java类型。包含:

7530
来自专栏码匠的流水账

聊聊nacos client的ServerListManager的start

本文主要研究一下nacos client的ServerListManager的start

9720
来自专栏码匠的流水账

聊聊nacos client的PushReceiver

nacos-1.1.3/client/src/main/java/com/alibaba/nacos/client/naming/core/PushReceiv...

12830
来自专栏黑伞攻防实验室

有趣的实战渗透案例分享

最近在做项目时遇到了一些比较有意思的案例,此处特意写下来与大家分享一下。由于此目标在第一波测试时已经获取到服务器的权限,后来由于种种原因要进行二次测试。想再次使...

8620
来自专栏Flink实战应用指南

Protobuf入门

Google的Protobuf作为一门开源的高性能的编解码框架,在通信框架中扮演者很重要的角色,很多商业项目将其作为编解码框架。Protobuf有以下优点:

14930
来自专栏Java研发军团

老王,怎么完整SQL的显示日志,而不是???...

在常规项目的开发中可能最容易出问题的地方就在于对数据库的处理了,在大部分的环境下,我们对数据库的操作都是使用流行的框架,比如 Hibernate 、 MyBat...

9920
来自专栏码匠的流水账

聊聊nacos server的PushService

nacos-1.1.3/naming/src/main/java/com/alibaba/nacos/naming/push/PushService.java

9930

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励