精华内容
下载资源
问答
  • Linux最大线程数限制及当前线程数查询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

    这样可以查看一个进程起的线程数。

    0b1331709591d260c1c78e86d0c51c18.png

    展开全文
  • 1、总结系统限制有:/proc/sys/kernel/pid_max #查系统支持的最大线程数,一般会很大,相当于理论值/proc/sys/kernel/threads-maxmax_user_process #系统限制某用户下最多可以运行多少进程或线程,使用命令:ulimit -...

    1、总结系统限制有:

    /proc/sys/kernel/pid_max #查系统支持的最大线程数,一般会很大,相当于理论值

    8f1df6e6c28f5783239b485171533991.png

    /proc/sys/kernel/threads-max

    20ec4884a193ff4d480a6c8318466097.png

    max_user_process #系统限制某用户下最多可以运行多少进程或线程,使用命令:ulimit -u

    d54751a455273a859e066bc17eaaadec.png

    注:修改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

    ffe12ce8e070ff5a38d73973cac4261d.png

    /proc/sys/vm/max_map_count #硬件内存大小

    58e4ab248b6366e78d2648e413d55b58.png

    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

    展开全文
  • JVM最大创建线程数量由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代码  8c3e86e5a4611834ce2ff0653949a19c.png

    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

    展开全文
  • 1、查看系统支持的最大线程(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】

    参考:

    展开全文
  • 1、总结系统限制有:/proc/sys/kernel/pid_max #查系统支持的最大线程数,一般会很大,相当于理论值/proc/sys/kernel/thread-maxmax_user_process(ulimit -u) #系统限制某用户下最多可以运行多少进程或线程/proc/sys...
  • 一、需求缘起Web-Server通常有个配置,最大工作线程数,后端服务一般也有个配置,工作线程池的线程数量,这个线程数的配置不同的业务架构师有不同的经验值,有些业务设置为CPU核数的2倍,有些业务设置为CPU核数的8倍...
  • java最大线程数

    2016-06-24 09:50:35
    二、分析问题:这个异常问题本质...能创建的线程数的具体计算公式如下:(MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = Number of threadsMaxProcessMemory 指的是一个进程的最大内存J...
  • java.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:45
    maximunPoolSize:最大线程数 每当有新的任务到线程池时, 第一步: 先判断线程池中当前线程数量是否达到了corePoolSize,若未达到,则新建线程运行此任务,且任务结束后将该线程保留在线程池中,不做销毁处理,若...
  • 摘自: Java线程池的核心线程数最大线程数总是容易混淆怎么办
  • 不知道原出处一、认识问题:首先我们通过下面这个测试程序来认识这个问题:运行的环境(有必要说明一下,不同环境会有不同的结果):32位 Windows XP,Sun JDK 1.6.0_18, eclipse 3.4,测试程序importjava.util....
  • 2019独角兽企业重金招聘... 一天,程序崩溃:## 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:11
    2, 如果程序确实需要大量的线程,现有的设置不能达到要求,那么可以通过修改MaxProcessMemory,JVMMemory,ThreadStackSize这三个因素,来增加能创建的线程数: a, MaxProcessMemory 使用64位操作系统 b, JVM...
  • Java的线程池就像是一个花瓶容器。 而把任务提交给线程池就像是把小球塞进花瓶。 整个过程就像下面这个有趣的动画: 下面我们先来了解一下Java线程池的参数。 希望看完这篇文章后, 再提起线程池的时候, 你脑海...
  • 这几天因为自己开发的一个网站在768M内存的机器上撑不起100多个用户的运行,因为每个用户启用功能后,系统将为每个用户分配8个左右的独立线程,我的这篇文章http://www.mzone.cc/article/311.html也有介绍的。...
  • 系统在运行时,有时候我们要控制它同时允许多少个线程运行,如果太多可能引起内存溢出之类的异常,所以在线程比较多的情况下我们可以控制它的最大线程数,这样系统可以在一种比较稳定的状态下运行。下面是一个简单...
  • 一天,程序崩溃:## There is insufficient memory for the Java Runtime Environment to continue.# Native memory allocation (malloc) failed to allocate 32756 bytes for ChunkPool::allocate# Possible ...
  • 一、JVM(JDK)最大线程数JVM最大创建线程数量由JVM堆内存大小、线程的Stack内存大小、系统最大可创建线程数(Java线程的实现是基于底层系统的线程机制来实现的,Windows下_beginthreadex,Linux下pthread_create)三个...
  • 一、认识问题:首先我们通过下面这个测试程序来认识这个问题:运行的环境(有必要说明一下,不同环境会有不同的结果):32位 Windows XP,Sun JDK 1.6.0_18, eclipse 3.4,测试程序:Java代码importjava.util.concurr....
  • 这个时候就需要使用多线程去处理。 一开始是这么配置的: @Configuration @EnableAsync(proxyTargetClass = true)//利用@EnableAsync注解开启异步任务支持 @ComponentScan({"com.ctfojt.auditbcarslogo.service"}) /...
  • 在高并发的情况下采用线程池,可以有效降低线程创建释放的时间花销及资源开销,如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存以及“过度切换”(在JVM中采用的处理机制为时间片轮转,减少了线程间...
  • 主要介绍了JAVA 自定义线程池的最大线程数设置方法,文中示例代码非常详细,供大家参考和学习,感兴趣的朋友可以了解下
  • parallelStream默认使用了fork-join框架,其默认线程数是CPU核心数。通过查阅资料,发现有两种方法来修改默认的多线程数量:1.全局设置在运行代码之前,加入如下代码:System.setProperty("java.util.concurrent....
  • java jvm 最大线程数设置

    万次阅读 2014-10-31 18:39:25
    最近想测试下Openfire下的最大并发,需要开大量线程来模拟客户端。对于一个JVM实例到底能开多少个线程一直心存疑惑,所以打算实际测试下,简单google了把,找到影响线程数量的因素有下面几个:   -...
  • Java编码的过程中,我们经常会创建一个线程来提高程序的执行效率,虽然这样实现起来很方便,但是会有一个问题:如果并发的线程数多,并且每个线程都是执行一个时间很短的任务就结束了,这样会造成频繁的创建和销毁...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,253
精华内容 901
关键字:

java线程数最大

java 订阅