单个JVM下支撑100w线程数

本文介绍了Linux系统中线程数量的限制因素及优化方法,包括如何计算最大线程数、系统参数调整以及与JVM相关的配置。还提供了监控线程和内存使用的命令。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载自:
http://blog.youkuaiyun.com/xiaolang85/article/details/74322277
http://blog.youkuaiyun.com/tiger0709/article/details/74296720
http://jzhihui.iteye.com/blog/1271122

I、创建的线程数的计算公式:

(MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = Number of threads

MaxProcessMemory 指的是一个进程的最大内存
JVMMemory JVM内存
ReservedOsMemory 保留的操作系统内存
ThreadStackSize 线程栈的大小

II、系统限制:

1.系统可以生成的最大线程数量 ==> /proc/sys/kernel/threads-max
2.系统可以生成的最大pid数量 ==> /proc/sys/kernel/pid_max
3.系统允许单用户创建的最大进程数量 ==> ulimit -amax user processes 这个参数的值
4.一个进程在VMAs(虚拟内存区域)拥有最大数量 ==>/proc/sys/vm/max_map_count,VMA是一个连续的虚拟地址空间,当进程创建一个内存映像文件时VMA的地址空间就会增加,当达到max_map_count了就是返回out of memory errors
5.一个进程可打开的最大文件数 ==> ulimit -aopen files 这个参数

III、参数调整

1.threads-max:直接修改 /proc/sys/kernel/threads-max,例如echo 10000 > /proc/sys/kernel/threads-max
2.pid_max:同上,直接修改 /proc/sys/kernel/pid_max
3.max user processes:
最大用户进程数需要在两个配置文件/etc/security/limits.conf/etc/security/limits.d/90-nproc.conf同时修改。
实际上,仅对nproc参数修改90-nproc.conf即可。

max user processes              (-u) 1024
/etc/security/limits.conf
/etc/security/limits.d/90-nproc.conf
*       soft    nproc           10240
*       hard    nproc           10240

4.max_map_count:

永久修改:将vm.max_map_count=2048000配置到/etc/sysctl.conf中,然后执行sysctl -p生效,重启os后也会持久。也可以:sysctl -w vm.max_map_count=2048000。也可以直接修改/proc/sys/vm/max_map_count

注意:在其他资源可用的前提下,单个JVM能开启的最大线程数是/proc/sys/vm/max_map_count的设置数的一半。

小结:如果要达到单个JVM开启100w以上的线程数,需要配置vm.max_map_count=2048000或者以上。因为默认vm.max_map_count=65530,因此缺省配置下,单个jvm能开启的最大线程数为其一半,即3w左右,大概32k的量

实际中,可以通过命令cat /proc/<pid>/maps |wc -l来监控,当前进程使用到的vm映射数量。

5.文件描述符:通过【ulimit -a】查看。
/etc/security/limits.conf中添加如下配置:

* soft nofile 1048576
* hard nofile 1048576

当soft和hard相同时,也可以用一条指令,如下:

* - nofile 1048576

III、Tip

检查命令: cat /proc/<pid>/limits

注意:Linux下每个进程的运行时限制结果都可以在目录/proc/<pid>下查看。

查看进程的线程数:pstree -p pid| wc -l或则ps -Lf pid | wc -l

IV、归纳

影响Java线程数量的因素
Java虚拟机本身:-Xms,-Xmx,-Xss;
系统限制:

/proc/sys/kernel/pid_max, ==> 81920==>对应到/etc/sysctl.conf为kernel.pid_max=81920
/proc/sys/kernel/thread-max,==> 对应到/etc/sysctl.conf为kernel.thread-max=8192000
max_user_process(ulimit -u)
/proc/sys/vm/max_map_count ==>对应到/etc/sysctl.conf为vm.max_map_mount=2048000,可以在/etc/sysctl.conf添加kernel.pid_max=819200 进行永久修改。


如果考虑JVM能支撑的最大tcp连接数,如MQ中,则也考虑thread,fd和tcp等。需要调整网络参数:可以通过grep ipv4 /etc/sysctl.conf查看。
/etc/sysctl.conf中添加如下配置:

fs.file-max = 1048576

net.ipv4.ip_local_port_range = 1024 65535

net.ipv4.tcp_mem = 786432 2097152 3145728

net.ipv4.tcp_rmem = 4096 4096 16777216

net.ipv4.tcp_wmem = 4096 4096 16777216

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_tw_recycle = 1
### JVM 线程私有实现机制及原理 JVM线程私有区域是指那些只为单个线程服务的数据结构,这些数据无法被其他线程访问。在线程私有区域内,最核心的部分是 **虚拟机栈** 和 **本地方法栈**。 #### 1. 虚拟机栈的作用与结构 每个线程在创建时都会为其分配一个独立的虚拟机栈,这个栈是由一系列的栈帧(Frame)组成的[^3]。每当调用一个 Java 方法时,就会有一个新的栈帧压入该线程的虚拟机栈;而当方法返回时,对应的栈帧会被弹出。这种设计使得不同线程之间的状态完全隔离,从而实现了线程的安全性和高效性。 #### 2. 时间片的概念及其影响 CPU 在多任务处理环境中会为每一个活动中的线程分配一定的时间段来执行指令,这一段时间被称为时间片[^2]。微观上来看,即使存在多个正在运行的应用程序或者进程,实际上同一时刻只会有一个线程真正占用 CPU 进行计算工作。通过这种方式,操作系统能够模拟并发效果——即宏观上的“同时运行”。 #### 3. 垃圾回收期间的行为调整 为了保证某些特定操作能够在全局范围内暂停所有应用级别的线程以便顺利完成,比如 Stop-The-World 类型的 GC 活动,则需要达到所谓的安全点(Safe Point)[^2]。此时除了负责维护系统的后台守护线程外,其余前台业务逻辑相关的线程均需进入等待状态直到整个过程结束为止。 #### 4. 编译优化过程中涉及的相关组件 另外还有专门用于提升性能表现的各种辅助线程如编译线程等它们主要承担将字节码转换成更高效的机器码的任务同时也参与到了 JIT(Just-In-Time Compiler)即时编译策略当中去进一步提高应用程序的整体效率水平[^2]. 综上所述,JVM 中关于线程私有的部分主要包括但不限于上述几个方面,从基础架构层面保障了各个独立工作的单元之间互不影响的同时又能很好地协同合作共同构建起了复杂的软件生态系统. ```java // 示例代码展示如何查看当前线程的信息 public class ThreadInfoExample { public static void main(String[] args) throws InterruptedException { System.out.println(Thread.currentThread().getName()); Runnable task = () -> { try { Thread.sleep(100); } catch (InterruptedException e) {} System.out.println("Task executed by: " + Thread.currentThread().getName()); }; new Thread(task).start(); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值