一台Java服务器能跑多少个线程?这个问题来自一次线上报警如下图,超过了我们的配置阈值。
图:京东自研UMP监控分析
打出jstack文件,通过IBM Thread and Monitor Dump Analyzer for Java工具查看如下:
图:IBM Thread and Monitor Dump Analyzer for Java
共计1661个线程,和监控数据得出的吻合。但这个数量应该是大了,我们都知道线程多了,就会有线程切换,带来性能开销。
当时就想到一台Java服务器到底可以跑多少个线程呢?跟什么有关系?现整理如下。
每个线程都有一个线程栈空间通过-Xss设置,查了一下我们服务器的关于jvm内存的配置
1 2 3 |
|
只有这三个,并没有-Xss 和-XX:ThreadStackSize的配置,因此是走的默认值。
图:JVM的默认栈大小
可以通过如下命令打印输出默认值的大小,命令:
1 |
|
例如:
1 2 |
|
不考虑系统限制,可以通过如下公式计算,得出最大线程数量。
线程数量 =(机器本身可用内存 - 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工程化、高性能及分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的朋友可以
加我的Java进阶群:744642380,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分
享给大家
相关推荐
Java Socket 实例(服务器多线程)是一种网络通信技术,用于在两台计算机之间建立可靠的、基于TCP协议的连接。在这个实例中,我们将探讨如何在Java中实现一个多线程的Socket服务器,以便同时处理多个客户端的请求。多...
本文将详细介绍一个基于Java实现的多线程文件上传系统,并结合队列管理技术来优化后台处理流程。该系统通过创建多个线程来并行处理客户端的文件上传请求,同时利用队列结构来协调任务的调度与执行。 #### 关键技术...
在本项目"java,socket多线程一对一聊天"中,我们探讨的是如何使用Java的Socket库来实现一个简单的、一对一的聊天应用。由于描述中提到“暂不支持并发”,我们可以理解这个系统可能只处理单个连接,而不是同时处理多...
在Java编程环境中,当涉及到两台服务器之间的文件传输时,主要涉及网络编程、I/O流处理和多线程等核心技术。下面将详细讲解这个过程,以及如何利用源码和工具来实现这一目标。 首先,我们需要了解Java中的网络编程...
Java是第一个在语言级别支持线程的主流编程语言。这一设计使得开发人员能够更容易地利用多线程的优势来提高程序性能,特别是在多处理器系统中。 #### 二、Java线程的使用场景 **2.1 提高用户界面响应速度** 在...
在StackOverflow上的讨论中,有人提到,一台Windows服务器在出现问题前可以支持6500个以上的线程,但这是在特定条件下的观察结果,并非普遍适用的数值。线程数量的合理范围需要根据具体的应用场景进行压力测试来确定...
Java服务器实例是一个面向初学者的学习资源,它演示了如何使用Java编程语言来构建一个简单的服务器。这个服务器能够监听特定的网络端口,并处理接收到的客户端请求。在深入讲解相关知识点之前,先来理解一下“服务器...
在这个WindowsApplicationTest中,我们可以推测它可能是一个包含Java Swing应用程序的测试项目,用于演示上述的多线程断点下载功能。通过运行这个程序,开发者可以直观地看到多线程下载的效率提升以及断点续传的便利...
本项目以"用java写的多线程聊天程序GUI界面socket实现"为主题,旨在展示如何通过Java实现一个基本的聊天应用程序。 首先,我们要理解Java的Socket编程。Socket是网络通信的基本单元,它提供了两台计算机之间的连接...
服务器端则创建一个`ServerThread`类,用于监听客户端的连接请求,并为每个新连接创建一个新的线程处理通信。为了保证消息的正确传递,通常会用到队列(如`java.util.concurrent.BlockingQueue`)来缓存接收到的消息...
另一种方法是使用Java NIO(非阻塞I/O),它允许服务器在一个线程中处理多个连接,通过选择器(Selector)监控多个通道(Channel)的状态,提高了服务器的并发性能。 在文件"ex2"中,可能包含了实现上述功能的示例...
在Java编程语言中,创建一个简单的多线程聊天室是一项有趣的实践,它涉及到网络编程、并发处理和用户交互等多个核心领域。在这个项目中,我们主要关注三个关键知识点:Java Socket编程、多线程以及聊天室的基本实现...
在给定的代码示例中,我们首先看到的是一个简单的Java多线程应用实例。这个例子展示了如何创建并启动一个新的线程。在`ThreadDemo`类的`main`方法中,我们创建了一个名为`TestThread`的新线程,并调用了它的`start()...
在实现多线程Web服务器时,我们需要创建一个主线程池,用于接收新的连接请求,然后将每个请求分配给一个工作线程来处理。每个工作线程负责读取请求、解析HTTP协议、执行相应的操作(如返回静态文件或执行动态脚本)...
最后,RMI(Remote Method Invocation)是Java中的一种分布式计算技术,它允许在不同JVM间的对象调用对方的方法,仿佛它们在同一台机器上。RMI包含两部分:远程接口和远程对象。远程接口定义了可被远程调用的方法,...
一个基于棋牌、MMORPG游戏的分布式java游戏服务器,理论上可以无限水平扩展网关服,大厅服、游戏服达到人数承载。实现了集群注册中心,网关、登陆、后台服务器监控等通用服务器;封装了redis集群、mongodb等数据库...
服务器是一台运行特定软件,等待并处理来自客户端请求的计算机。客户端则是发起请求的设备或程序。在Java中,我们可以使用Socket编程来实现服务器和客户端之间的连接。 1. **Java Socket编程**: Java中的`java...
请注意,这只是一个基本的示例,实际的客户端-服务器通信可能涉及错误处理、多线程、数据验证等更复杂的内容。此外,没有使用JSON意味着数据解析可能需要更多的自定义逻辑,可能增加了理解和维护的难度。在生产环境...
Java Socket服务器客户端程序是网络编程中的基础组件,用于实现两台计算机之间的通信。Socket编程是Java提供的一个标准接口,它允许应用程序通过网络发送和接收数据。在这个程序中,我们将探讨以下几个核心知识点: ...
完成上述步骤后,你就能拥有一个可以从远程控制并显示另一台设备屏幕的Java应用程序,并且这个程序已经打包成了.exe文件,方便在Windows环境下运行。记住,良好的文档和注释对于理解和维护这样的项目至关重要。