-
linux查看java线程数最大数_Linux最大线程数限制及当前线程数查询
2021-03-13 13:20:54Linux最大线程数限制及当前线程数查询1、总结系统限制有:/proc/sys/kernel/pid_max #查系统支持的最大线程数,一般会很大,相当于理论值/proc/sys/kernel/thread-maxmax_user_process(ulimit -u) #系统限制某用户下...Linux最大线程数限制及当前线程数查询
1、总结系统限制有:
/proc/sys/kernel/pid_max #查系统支持的最大线程数,一般会很大,相当于理论值
/proc/sys/kernel/thread-max
max_user_process(ulimit -u) #系统限制某用户下最多可以运行多少进程或线程
/proc/sys/vm/max_map_count
硬件内存大小
2、Java虚拟机本身限制:
-Xms #intial java heap size
-Xmx #maximum java heap size
-Xss #the stack size for each thread
3、查询当前某程序的线程或进程数
pstree -p `ps -e | grep java | awk '{print $1}'` | wc -l
或
pstree -p 3660 | wc -l
4、查询当前整个系统已用的线程或进程数
pstree -p | wc -l
1、 cat /proc/${pid}/status
2、pstree -p ${pid}
3、top -p ${pid} 再按H 或者直接输入 top -bH -d 3 -p ${pid}
top -H
手册中说:-H : Threads toggle
加上这个选项启动top,top一行显示一个线程。否则,它一行显示一个进程。
4、ps xH
手册中说:H Show threads as if they were processes
这样可以查看所有存在的线程。
5、ps -mp
手册中说:m Show threads after processes
这样可以查看一个进程起的线程数。
-
linux java线程数_Linux最大线程数限制及当前线程数查询
2021-02-12 22:18:131、总结系统限制有:/proc/sys/kernel/pid_max #查系统支持的最大线程数,一般会很大,相当于理论值/proc/sys/kernel/threads-maxmax_user_process #系统限制某用户下最多可以运行多少进程或线程,使用命令:ulimit -...1、总结系统限制有:
/proc/sys/kernel/pid_max #查系统支持的最大线程数,一般会很大,相当于理论值
/proc/sys/kernel/threads-max
max_user_process #系统限制某用户下最多可以运行多少进程或线程,使用命令:ulimit -u
注:修改max_user_process的数值,只需要修改/etc/security/limits.conf即可,但是这个参数需要修改/etc/security/limits.d/90-nproc.conf
附录:
附录1:centos 6.*可以修改/etc/security/limits.d/90-nproc.conf
我这边是通过修改/etc/security/limits.conf,在最后添加
* soft nproc 65535
* hard nproc 65535
查看默认的线程栈大小,单位是字节(Bytes),使用命令:ulimit -s
/proc/sys/vm/max_map_count #硬件内存大小
2、Java虚拟机本身限制:
-Xms #intial java heap size
-Xmx #maximum java heap size
-Xss #the stack size for each thread
3、查询当前某程序的线程或进程数
# pstree -p `ps -e | grep java | awk '{print $1}'` | wc -l
上面用的是命令替换,关于命令替换,就是说用``括起来的命令会优先执行,然后以其输出作为其他命令的参数
或
# pstree -p 进程号 | wc -l
# top -H 进程号 | wc -l
上面用的是管道,关于管道:管道符号"|"左边命令的输出作为右边命令的输入
4、查询当前整个系统已用的线程或进程数
pstree -p | wc -l
-
java jvm 线程数_JVM最大线程数
2021-02-25 19:18:36JVM最大创建线程数量由JVM堆内存大小、线程的Stack内存大小、系统最大可创建线程数(Java线程的实现是基于底层系统的线程机制来实现的,Windows下_beginthreadex,Linux下pthread_create)三个方面影响。具体如下:-...JVM最大创建线程数量由JVM堆内存大小、线程的Stack内存大小、系统最大可创建线程数(Java线程的实现是基于底层系统的线程机制来实现的,Windows下_beginthreadex,Linux下pthread_create)三个方面影响。具体如下:
-Xms 最小堆内存
-Xmx
最大堆内存
-Xss
设置每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M
操作系统限制
系统最大可开线程数,主要受以下几个参数影响
/proc/sys/kernel/pid_max
/proc/sys/kernel/thread-max
max_user_process(ulimit -u) 在64位Linux系统(CentOS 6, 3G内存)下测试,发现还有一个参数是会限制线程数量:max user process(可通过ulimit –a查看,默认值1024,通过ulimit –u可以修改此值),这个值在上面的32位Ubuntu测试环境下并无限制
/proc/sys/vm/max_map_count
将threads-max,pid_max,max user process,这三个参数值都修改成100000,-Xms,-Xmx尽量小(128m,64m),-Xss尽量小(64位下最小104k,可取值128k)。事先预测在这样的测试环境下,线程数量就只会受限于测试环境的内存大小(3G),可是实际的测试结果是线程数量在达到32K(32768,创建的数量最多的时候大概是33000左右)左右时JVM是抛出警告:Attempt to allocate stack guard pages failed,然后出现OutOfMemoryError无法创建本地线程。查看内存后发现还有很多空闲,所以应该不是内存容量的原因。/proc/sys/vm/max_map_count的数量翻倍,从65536变为131072,创建的线程总数量达到65000+,电脑基本要卡死(3G内存)…
简单查了下这个参数的作用,在[8]中的描述如下:
“This file contains the maximum number of memory map areas a process may have. Memory map areas are used as a side-effect of calling malloc, directly by mmap and mprotect, and also when loading shared libraries.
While most applications need less than a thousand maps, certain programs, particularly malloc debuggers, may consume lots of them, e.g., up to one or two maps per allocation.
The default value is 65536.”
操作系统最大线程数限制
32位Linux系统可创建的最大pid数是32678,这个数值可以通过/proc/sys/kernel/pid_max来做修改(修改其值为10000:echo
10000 >
/proc/sys/kernel/pid_max),但是在32系统下这个值只能改小,无法改大。
Windows可创建的线程数量比linux可能更少。
在64位Linux系统(CentOS 6)下,还有一个参数会限制线程数量:max user
process(可通过ulimit –a查看,默认值1024,通过ulimit –u可以修改此值)
测试程序如下:
import java.util.concurrent.atomic.AtomicInteger;
public class TestThread extends Thread {
private static final AtomicInteger count = new AtomicInteger();
public static void main(String[] args) {
while (true)
(new TestThread()).start();
}
@Override
public void run() {
System.out.println(count.incrementAndGet());
while (true)
try {
Thread.sleep(Integer.MAX_VALUE);
} catch (InterruptedException e) {
break;
}
}
}
测试环境:
系统:Ubuntu 10.04 Linux Kernel 2.6 (32位)
内存:2G
JDK:1.7
测试结果:
◆ 不考虑系统限制
-Xms
-Xmx
-Xss
结果
1024m
1024m
1024k
1737
1024m
1024m
64k
26077
512m
512m
64k
31842
256m
256m
64k
31842
在创建的线程数量达到31842个时,系统中无法创建任何线程。
由上面的测试结果可以看出增大堆内存(-Xms,-Xmx)会减少可创建的线程数量,增大线程栈内存(-Xss,32位系统中此参数值最小为60K)也会减少可创建的线程数量。
◆ 结合系统限制
线程数量31842的限制是是由系统可以生成的最大线程数量决定的:/proc/sys/kernel/threads-max,可其默认值是32080。修改其值为10000:echo 10000 > /proc/sys/kernel/threads-max,修改后的测试结果如下:
-Xms
-Xmx
-Xss
结果
256m
256m
64k
9761
这样的话,是不是意味着可以配置尽量多的线程?再做修改:echo 1000000 > /proc/sys/kernel/threads-max,修改后的测试结果如下:
-Xms
-Xmx
-Xss
结果
256m
256m
64k
32279
128m
128m
64k
32279
发现线程数量在达到32279以后,不再增长。查了一下,32位Linux系统可创建的最大pid数是32678,这个数值可以通过/proc/sys/kernel/pid_max来做修改(修改方法同threads-max),但是在32系统下这个值只能改小,无法更大。在threads-max一定的情况下,修改pid_max对应的测试结果如下:
pid_max
-Xms
-Xmx
-Xss
结果
1000
128m
128m
64k
582
10000
128m
128m
64k
9507
在Windows上的情况应该类似,不过相比Linux,Windows上可创建的线程数量可能更少。基于线程模型的服务器总要受限于这个线程数量的限制。
总结:
JVM中可以生成的最大数量由JVM的堆内存大小、Thread的Stack内存大小、系统最大可创建的线程数量(Java线程的实现是基于底层系统的线程机制来实现的,Windows下_beginthreadex,Linux下pthread_create)三个方面影响。具体数量可以根据Java进程可以访问的最大内存(32位系统上一般2G)、堆内存、Thread的Stack内存来估算。
一、模拟问题:
首先我们通过下面这个测试程序 来认识这个问题:
运行的环境 (有必要说明一下,不同环境会有不同的结果):32位 Windows XP,Sun JDK 1.6.0_18, eclipse 3.4,
测试程序:
Java代码
import java.util.concurrent.CountDownLatch;
public class TestNativeOutOfMemoryError {
public static void main(String[] args) {
for (int i = 0;; i++) {
System.out.println("i = " + i);
new Thread(new HoldThread()).start();
}
}
}
class HoldThread extends Thread {
CountDownLatch cdl = new CountDownLatch(1);
public HoldThread() {
this.setDaemon(true);
}
public void run() {
try {
cdl.await();
} catch (InterruptedException e) {
}
}
}
不指定任何JVM参数,eclipse中直接运行输出,看到了这位朋友了吧:
i = 5602
Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread
at java.lang.Thread.start0(Native Method)
at java.lang.Thread.start(Thread.java:597)
at TestNativeOutOfMemoryError.main(TestNativeOutOfMemoryError.java:20)
二、分析问题:
这个异常问题本质原因是我们创建了太多的线程,而能创建的线程数是有限制的,导致了异常的发生。能创建的线程数的具体计算公式如下:
(MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = Number of threads
MaxProcessMemory 指的是一个进程的最大内存
JVMMemory JVM内存
ReservedOsMemory 保留的操作系统内存
ThreadStackSize 线程栈的大小
在java语言里, 当你创建一个线程的时候,虚拟机会在JVM内存创建一个Thread对象同时创建一个操作系统线程,而这个系统线程的内存用的不是JVMMemory,而是系统中剩下的内存(MaxProcessMemory - JVMMemory - ReservedOsMemory)。
结合上面例子我们来对公式说明一下:
MaxProcessMemory 在32位的 windows下是 2G
JVMMemory eclipse默认启动的程序内存是64M
ReservedOsMemory 一般是130M左右
ThreadStackSize 32位 JDK 1.6默认的stacksize 325K左右
公式如下:
(2*1024*1024-64*1024-130*1024)/325 = 5841
公式计算所得5841,和实践5602基本一致(有偏差是因为ReservedOsMemory不能很精确)
由公式得出结论:你给JVM内存越多,那么你能创建的线程越少,越容易发生java.lang.OutOfMemoryError: unable to create new native thread。
咦,有点背我们的常理,恩,让我们来验证一下,依旧使用上面的测试程序,加上下面的JVM参数,测试结果如下:
ThreadStackSize JVMMemory 能创建的线程数
默认的325K -Xms1024m -Xmx1024m i = 2655
默认的325K -Xms1224m -Xmx1224m i = 2072
默认的325K -Xms1324m -Xmx1324m i = 1753
默认的325K -Xms1424m -Xmx1424m i = 1435
-Xss1024k -Xms1424m -Xmx1424m i = 452
完全和公式一致。
三、解决问题:
1,如果程序中有bug,导致创建大量不需要的线程或者线程没有及时回收,那么必须解决这个bug,修改参数是不能解决问题的。
2,如果程序确实需要大量的线程,现有的设置不能达到要求,那么可以通过修改MaxProcessMemory,JVMMemory,ThreadStackSize这三个因素,来增加能创建的线程数:
a, MaxProcessMemory 使用64位操作系统
b, JVMMemory 减少JVMMemory的分配
c, ThreadStackSize 减小单个线程的栈大小
参考资料:
1. http://blog.krecan.net/2010/04/07/how-many-threads-a-jvm-can-handle/
2. http://www.cyberciti.biz/tips/maximum-number-of-processes-linux-26-kernel-can-handle.html
3. http://geekomatic.ch/2010/11/24/1290630420000.html
4. http://stackoverflow.com/questions/763579/how-many-threads-can-a-java-vm-support
5. http://www.iteye.com/topic/1035818
6. http://hi.baidu.com/hexiong/blog/item/16dc9e518fb10c2542a75b3c.html
7. https://listman.redhat.com/archives/phil-list/2003-August/msg00025.html
8. http://www.linuxinsight.com/proc_sys_vm_max_map_count.html
http://jzhihui.iteye.com/blog/1271122
http://sesame.iteye.com/blog/622670
-
Linux上看Java线程数_linux3-Linux最大线程数限制及当前线程数查询
2021-03-17 13:27:371、查看系统支持的最大线程(1) /proc/sys/kernel/pid_max :系统支持的最大线程数.32位Linux系统可创建的最大pid数是32678,这个数值可以通过/proc/sys/kernel/pid_max来做修改cat /proc/sys/kernel/pid_max #查看...1、查看系统支持的最大线程
(1) /proc/sys/kernel/pid_max :系统支持的最大线程数.32位Linux系统可创建的最大pid数是32678,这个数值可以通过/proc/sys/kernel/pid_max来做修改
cat /proc/sys/kernel/pid_max #查看
echo 10000 > /proc/sys/kernel/pid_max #修改
(2) /proc/sys/kernel/thread-max
cat /proc/sys/kernel/threads-max #查看
echo 10000 > /proc/sys/kernel/threads-max
(3)max_user_process(ulimit -u) #系统限制某用户下最多可以运行多少进程或线程
ulimit -u 【值】:查看、修改
(4)max_map_count文件包含限制一个进程可以拥有的VMA(虚拟内存区域)的数量。
cat /proc/sys/vm/max_map_count :查看max_map_count
echo 10000 > proc/sys/vm/max_map_count #修改
2、Java虚拟机本身限制:
-Xms #intial java heap size
-Xmx #maximum java heap size
-Xss #the stack size for each thread
3、查询当前某程序的线程或进程数
pstree -p 3660 | wc -l
4、查询当前整个系统已用的线程或进程数
pstree -p | wc -l
5、其他查看命令
top -p 【pid】
pstree -p 【pid】
参考:
-
linux java线程数_linux 内核参数优化----最大线程数限制及当前线程数查询
2021-03-03 16:09:301、总结系统限制有:/proc/sys/kernel/pid_max #查系统支持的最大线程数,一般会很大,相当于理论值/proc/sys/kernel/thread-maxmax_user_process(ulimit -u) #系统限制某用户下最多可以运行多少进程或线程/proc/sys... -
java 线程数_JAVA之工作线程数究竟要设置多少
2021-02-12 09:21:19一、需求缘起Web-Server通常有个配置,最大工作线程数,后端服务一般也有个配置,工作线程池的线程数量,这个线程数的配置不同的业务架构师有不同的经验值,有些业务设置为CPU核数的2倍,有些业务设置为CPU核数的8倍... -
java最大线程数
2016-06-24 09:50:35二、分析问题:这个异常问题本质...能创建的线程数的具体计算公式如下:(MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = Number of threadsMaxProcessMemory 指的是一个进程的最大内存J... -
java线程池最大线程数_线程池 最大线程数
2021-03-07 04:28:39java.lang.OutOfMemoryError: unable to create new native threadat java.lang.Thread.start0(Native Method) ~[na:1.7.0_45]at java.lang.Thread.start(Thread.java:713) ~[na:1.7.0_45]at java.util.concurrent.T... -
Java线程池核心线程数与最大线程数的区别
2020-06-23 15:20:45maximunPoolSize:最大线程数 每当有新的任务到线程池时, 第一步: 先判断线程池中当前线程数量是否达到了corePoolSize,若未达到,则新建线程运行此任务,且任务结束后将该线程保留在线程池中,不做销毁处理,若... -
Java几种线程池的核心线程数和最大线程数详解
2020-07-23 13:21:55摘自: Java线程池的核心线程数和最大线程数总是容易混淆怎么办 -
java 最大线程数_JVM可支持的最大线程数
2021-02-27 19:26:19不知道原出处一、认识问题:首先我们通过下面这个测试程序来认识这个问题:运行的环境(有必要说明一下,不同环境会有不同的结果):32位 Windows XP,Sun JDK 1.6.0_18, eclipse 3.4,测试程序importjava.util.... -
java 线程个数 栈大小_Java:JVM可创建的最大线程数 & JVM线程堆栈
2021-03-17 22:14:572019独角兽企业重金招聘... 一天,程序崩溃:## There is insufficient memory for the Java Runtime Environment to continue.# Native memory allocation (malloc) failed to allocate 32756 bytes for ChunkPo... -
java 最大线程数
2015-06-12 15:14:41工作中碰到过这个问题好几次了,觉得有必要总结一下,所以有了这篇文章,这篇文章分为三个部分:认识问题、分析问题、解决问题。 一、认识问题: ...首先我们通过下面这个 测试程序 来认识这个问题:...Java代码 -
Java最大线程数
2015-12-01 00:01:112, 如果程序确实需要大量的线程,现有的设置不能达到要求,那么可以通过修改MaxProcessMemory,JVMMemory,ThreadStackSize这三个因素,来增加能创建的线程数: a, MaxProcessMemory 使用64位操作系统 b, JVM... -
Java线程池的核心线程数和最大线程数
2021-03-14 19:24:35Java的线程池就像是一个花瓶容器。 而把任务提交给线程池就像是把小球塞进花瓶。 整个过程就像下面这个有趣的动画: 下面我们先来了解一下Java线程池的参数。 希望看完这篇文章后, 再提起线程池的时候, 你脑海... -
java 最大线程数_JVM可生产的最大线程数 Thread 数量
2021-03-21 09:49:03这几天因为自己开发的一个网站在768M内存的机器上撑不起100多个用户的运行,因为每个用户启用功能后,系统将为每个用户分配8个左右的独立线程,我的这篇文章http://www.mzone.cc/article/311.html也有介绍的。... -
java 线程 控制_Java线程个数简单控制
2021-02-12 13:10:56系统在运行时,有时候我们要控制它同时允许多少个线程运行,如果太多可能引起内存溢出之类的异常,所以在线程比较多的情况下我们可以控制它的最大线程数,这样系统可以在一种比较稳定的状态下运行。下面是一个简单... -
java jvm 线程数_Java:JVM可创建的最大线程数 & JVM线程堆栈
2021-02-25 19:18:32一天,程序崩溃:## There is insufficient memory for the Java Runtime Environment to continue.# Native memory allocation (malloc) failed to allocate 32756 bytes for ChunkPool::allocate# Possible ... -
linux java线程数量_关于JVM(JDK),Tomcat,Linux的最大线程数问题
2021-02-27 20:13:14一、JVM(JDK)最大线程数JVM最大创建线程数量由JVM堆内存大小、线程的Stack内存大小、系统最大可创建线程数(Java线程的实现是基于底层系统的线程机制来实现的,Windows下_beginthreadex,Linux下pthread_create)三个... -
java jvm 线程数_JVM可支持的最大线程数
2021-02-27 22:37:53一、认识问题:首先我们通过下面这个测试程序来认识这个问题:运行的环境(有必要说明一下,不同环境会有不同的结果):32位 Windows XP,Sun JDK 1.6.0_18, eclipse 3.4,测试程序:Java代码importjava.util.concurr.... -
java线程池合理设置最大线程数和核心线程数
2020-10-10 17:13:31这个时候就需要使用多线程去处理。 一开始是这么配置的: @Configuration @EnableAsync(proxyTargetClass = true)//利用@EnableAsync注解开启异步任务支持 @ComponentScan({"com.ctfojt.auditbcarslogo.service"}) /... -
java线程池最大线程数_Java并发(八)计算线程池最佳线程数
2021-02-12 11:20:07在高并发的情况下采用线程池,可以有效降低线程创建释放的时间花销及资源开销,如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存以及“过度切换”(在JVM中采用的处理机制为时间片轮转,减少了线程间... -
JAVA 自定义线程池的最大线程数设置方法
2020-08-18 23:52:26主要介绍了JAVA 自定义线程池的最大线程数设置方法,文中示例代码非常详细,供大家参考和学习,感兴趣的朋友可以了解下 -
java 最大线程数 设定_Java8 parallelStream 修改默认的线程数量
2021-03-12 22:55:47parallelStream默认使用了fork-join框架,其默认线程数是CPU核心数。通过查阅资料,发现有两种方法来修改默认的多线程数量:1.全局设置在运行代码之前,加入如下代码:System.setProperty("java.util.concurrent.... -
java jvm 最大线程数设置
2014-10-31 18:39:25最近想测试下Openfire下的最大并发数,需要开大量线程来模拟客户端。对于一个JVM实例到底能开多少个线程一直心存疑惑,所以打算实际测试下,简单google了把,找到影响线程数量的因素有下面几个: -... -
java线程池最大线程数_java线程池常用参数设置
2021-02-12 11:20:07在Java编码的过程中,我们经常会创建一个线程来提高程序的执行效率,虽然这样实现起来很方便,但是会有一个问题:如果并发的线程数多,并且每个线程都是执行一个时间很短的任务就结束了,这样会造成频繁的创建和销毁...