I、环境要求:
1.64bit Linux
2.64bit JDK
3.Memory够大,512GB
4.cpu:64 processors
II、测试工具:【DieLikeADog.java】
java -server -Xmx6G -Xms6G -Xmn600M -Xss228K -XX:PermSize=50M -XX:MaxPermSize=50M -XX:+DisableExplicitGC DieLikeADog
III、检查配置:
1.ps -Lf <pid> |wc -l ==>查看某个进程中的线程数量
2.ulimit -a==>
>>>主要查看-n,-u的值
3.cat /proc/sys/vm/max_map_count
永久修改:将vm.max_map_count=2048000配置到/etc/sysctl.conf中,然后执行sysctl -p生效,重启os后也会持久。
也可以:【sysctl -w vm.max_map_count=2048000】
注意:在其他资源可用的前提下,单个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映射数量。
4.最大用户进程数:需要在两个配置文件/etc/security/limits.conf和/etc/security/limits.d/90-nproc.conf同时修改
实际上,仅对nproc参数修改90-nproc.conf即可。
//////////begin////////
max user processes (-u) 1024
/etc/security/limits.conf
/etc/security/limits.d/90-nproc.conf
* soft nproc 10240
* hard nproc 10240
//////////end//////////
5.文件描述符:通过【ulimit -a】查看
//////////begin//////
在/etc/security/limits.conf中添加如下配置:
* soft nofile 1048576
* hard nofile 1048576
//////////end////////
当soft和hard相同时,也可以用一条指令,如下:
////////begin/////
* - nofile 1048576
////////end///////
6.调整网络参数:可以通过【grep ipv4 /etc/sysctl.conf】查看
在/etc/sysctl.conf中添加如下配置:
//////////begin/////////
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
//////////end////////
IV、【总结】如果只考虑单个jvm在本机能开的最大线程数,考虑1234步即可,如果考虑JVM能支撑的最大tcp连接数,如MQ中,
则也考虑thread,fd和tcp等,所以需要涉及123456步。
V、Tip:
>>>检查命令
# cat /proc/<pid>/limits
Limit Soft Limit Hard Limit Units
Max cpu time unlimited unlimited seconds
Max file size unlimited unlimited bytes
Max data size unlimited unlimited bytes
Max stack size 209715200 209715200 bytes
Max core file size 0 unlimited bytes
Max resident set unlimited unlimited bytes
Max processes 204800 204800 processes
Max open files 1048576 1048576 files
Max locked memory 10485760 10485760 bytes
Max address space unlimited unlimited bytes
Max file locks unlimited unlimited locks
Max pending signals 4133863 4133863 signals
Max msgqueue size 819200 819200 bytes
Max nice priority 0 0
Max realtime priority 0 0
Max realtime timeout unlimited unlimited us
>>>注意:Linux下每个进程的运行时限制结果都可以在目录/proc/<pid>下查看。
>>>参考:http://www.redhat.com/magazine/001nov04/features/vm/
VI、【归纳】
影响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
进行永久修改。
【温馨提示】
如果您觉得满意,可以选择支持下,您的支持是我最大的动力:
分享到:
相关推荐
并发则是指多个线程在执行时,在宏观上看起来像是同时进行的,但在微观上,由于CPU的单个核心在同一时刻只能执行一个线程,因此实际上是通过快速切换线程来达到并发的效果。 #### JVM对线程的资源同步和交互机制 ...
- **ThreadPoolExecutor的定制**:可配置核心线程数、最大线程数、任务队列、拒绝策略等。 - **线程的中断与任务的取消**:线程中断标志的使用,以及Future的cancel方法来取消任务。 随着硬件的演进,开发者面临...
- `volatile`关键字:用于变量,确保多线程环境下的可见性和有序性。 - `Lock`接口和`ReentrantLock`类:提供比`synchronized`更细粒度的锁控制。 5. **线程优先级**: Java中的线程有10个优先级,由`Thread.MIN...
6. **JVM Bug**:某些情况下,崩溃可能由JVM自身的bug引起。确认JVM版本,更新到最新稳定版。 7. **日志分析**:hs_err_pid26290.log文件会包含堆栈跟踪信息,可以帮助我们定位到导致问题的代码行。同时,结合应用...
- `acceptCount="100"`:当所有线程都被占用时,可以接受并放入等待队列中的最大客户端连接数为100个。 ##### 2. 管理员账号配置 为了便于管理和监控Tomcat的运行状态,可以通过配置`D:\tomcat7\conf\tomcat-users....
Java中的IO(输入/输出)和线程是两个核心概念,它们在开发高效、响应性强的应用程序时起着至关重要的作用。输入/输出处理数据的传输,而多线程则涉及程序的并发执行。 首先,让我们深入理解Java的IO系统。Java.IO...
### IBM JVM 参数选项详解 IBM Java虚拟机(JVM)为开发者提供了丰富的配置选项来优化应用程序性能、诊断问题以及调整各种资源使用情况。本文将详细解释IBM JVM中的关键参数及其功能,帮助您更好地管理和调优Java...
当线程请求的栈深度超过虚拟机允许的最大深度,比如递归调用过多或单个方法的局部变量过多,就会导致栈溢出(StackOverflowError)。此外,如果虚拟机栈尝试扩展但无法分配更多内存,就会抛出OutOfMemoryError。可...
多线程是指在单个应用程序中同时运行多个线程,每个线程都有自己的程序计数器、系统栈以及局部变量,共享同一内存空间。这种技术可以提高程序的响应速度和资源利用率,尤其是在执行I/O密集型或计算密集型任务时。 ...
Java作为一种广泛使用的编程语言,其核心优势之一便是“一次编写,到处运行”的特性,这背后的关键技术支撑即为Java虚拟机(JVM)。JVM是一种抽象计算模型,允许Java程序在多种平台上运行而无需重新编译。 ##### ...
线程是进程中的一个执行路径,单个进程可以包含多个线程,这些线程共享进程的内存空间和资源,但拥有各自的调用栈和程序计数器。 Java虚拟机(JVM)启动时,会创建一个进程,这个进程会自动启动一个主线程,用于...
Java多线程在不同平台下的执行效率受到操作系统类型、JVM版本以及线程数量和优先级的影响。实验发现,在Linux环境下,使用NPTL线程机制的JDK版本比使用LinuxThreads的版本有更高的线程切换效率。同时,线程的优先级...
### JVM 6 详细参数分析 #### 概述 本文档深入探讨了Java 6 (JDK 6) 的JVM参数配置,旨在为开发者提供一份详尽的指南,帮助理解并合理设置JVM参数以优化Java应用程序的性能。本文档基于最新的SUN官方文档编写,并...
- 当所有的非守护线程结束时,即使还有守护线程在运行,JVM也会退出。 - 常用于后台任务,如垃圾回收(GC)。 - 通过`Thread.setDaemon(boolean on)`方法设置线程为守护线程,通过`Thread.isDaemon()`方法检查一...
- **虚拟机栈(Java Virtual Machine Stack)**:也是线程私有的,用来存储局部变量表、操作数栈、动态链接、方法出口等信息。当线程调用方法时,会创建一个栈帧来存储该方法的信息。 - **本地方法栈(Native Method ...
在多线程环境下,多个线程可以并行地在单个进程中执行,使得程序能够同时处理多项任务。 Java中的线程是通过`Thread`类或实现`Runnable`接口来创建的。你可以直接继承`Thread`类并重写`run()`方法,或者创建一个...
例如,在单个JVM中加载整个Twitter社交图或所有用户元数据等操作。此时,优化内部数据表示至关重要。此外,还需要检查是否存在真实的内存泄露。 - **解决过多数据问题:** - 使用`-verbosegc`参数运行程序,观察...
Java多线程是Java编程语言的重要特性之一,它允许开发者在单个程序中同时运行多个部分,这些部分可以并发执行。掌握Java多线程技术对于设计高效的并发程序、充分利用多核处理器资源、提高应用程序的执行效率至关重要...
但在微观层面上,由于单个CPU在同一时刻只能执行一个线程,因此实际上各个线程是在轮换执行的,这种现象称为**伪并发**。 #### 二、启动线程的两种方式 1. **继承Thread类:** - 可以通过继承`Thread`类并重写`...