`
can_do
  • 浏览: 258397 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

单个JVM下支撑100w线程数

阅读更多
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   
进行永久修改。

【温馨提示】
如果您觉得满意,可以选择支持下,您的支持是我最大的动力:

分享到:
评论

相关推荐

    Java分布式应用学习笔记03JVM对线程的资源同步和交互机制

    并发则是指多个线程在执行时,在宏观上看起来像是同时进行的,但在微观上,由于CPU的单个核心在同一时刻只能执行一个线程,因此实际上是通过快速切换线程来达到并发的效果。 #### JVM对线程的资源同步和交互机制 ...

    并发编程实践,全面介绍基础知识、JVM同步原语、线程安全、低级并发工具、线程安全容器、高级线程协作工具、Executor部分等

    - **ThreadPoolExecutor的定制**:可配置核心线程数、最大线程数、任务队列、拒绝策略等。 - **线程的中断与任务的取消**:线程中断标志的使用,以及Future的cancel方法来取消任务。 随着硬件的演进,开发者面临...

    Java建立一个单线程的实例.rar

    - `volatile`关键字:用于变量,确保多线程环境下的可见性和有序性。 - `Lock`接口和`ReentrantLock`类:提供比`synchronized`更细粒度的锁控制。 5. **线程优先级**: Java中的线程有10个优先级,由`Thread.MIN...

    JVM崩溃

    6. **JVM Bug**:某些情况下,崩溃可能由JVM自身的bug引起。确认JVM版本,更新到最新稳定版。 7. **日志分析**:hs_err_pid26290.log文件会包含堆栈跟踪信息,可以帮助我们定位到导致问题的代码行。同时,结合应用...

    IO和线程java输入输出 多线程

    Java中的IO(输入/输出)和线程是两个核心概念,它们在开发高效、响应性强的应用程序时起着至关重要的作用。输入/输出处理数据的传输,而多线程则涉及程序的并发执行。 首先,让我们深入理解Java的IO系统。Java.IO...

    IBM JVM参数选项

    ### IBM JVM 参数选项详解 IBM Java虚拟机(JVM)为开发者提供了丰富的配置选项来优化应用程序性能、诊断问题以及调整各种资源使用情况。本文将详细解释IBM JVM中的关键参数及其功能,帮助您更好地管理和调优Java...

    JVM常见面试题解析.pdf

    当线程请求的栈深度超过虚拟机允许的最大深度,比如递归调用过多或单个方法的局部变量过多,就会导致栈溢出(StackOverflowError)。此外,如果虚拟机栈尝试扩展但无法分配更多内存,就会抛出OutOfMemoryError。可...

    多线程编程 多线程编程

    多线程是指在单个应用程序中同时运行多个线程,每个线程都有自己的程序计数器、系统栈以及局部变量,共享同一内存空间。这种技术可以提高程序的响应速度和资源利用率,尤其是在执行I/O密集型或计算密集型任务时。 ...

    jvm详解(java虚拟机详解)

    Java作为一种广泛使用的编程语言,其核心优势之一便是“一次编写,到处运行”的特性,这背后的关键技术支撑即为Java虚拟机(JVM)。JVM是一种抽象计算模型,允许Java程序在多种平台上运行而无需重新编译。 ##### ...

    Java语言程序设计教程课件第十一章多线程程序设计

    线程是进程中的一个执行路径,单个进程可以包含多个线程,这些线程共享进程的内存空间和资源,但拥有各自的调用栈和程序计数器。 Java虚拟机(JVM)启动时,会创建一个进程,这个进程会自动启动一个主线程,用于...

    基于环境的java多线程行为比较分析

    Java多线程在不同平台下的执行效率受到操作系统类型、JVM版本以及线程数量和优先级的影响。实验发现,在Linux环境下,使用NPTL线程机制的JDK版本比使用LinuxThreads的版本有更高的线程切换效率。同时,线程的优先级...

    JVM 6 详细参数(中文版)

    ### JVM 6 详细参数分析 #### 概述 本文档深入探讨了Java 6 (JDK 6) 的JVM参数配置,旨在为开发者提供一份详尽的指南,帮助理解并合理设置JVM参数以优化Java应用程序的性能。本文档基于最新的SUN官方文档编写,并...

    Java线程培训资料

    - 当所有的非守护线程结束时,即使还有守护线程在运行,JVM也会退出。 - 常用于后台任务,如垃圾回收(GC)。 - 通过`Thread.setDaemon(boolean on)`方法设置线程为守护线程,通过`Thread.isDaemon()`方法检查一...

    JAVA核心知识点整理,涵盖JAVA基础、集合类、JVM、IO/NIO、多线程、Spring原理等知识

    - **虚拟机栈(Java Virtual Machine Stack)**:也是线程私有的,用来存储局部变量表、操作数栈、动态链接、方法出口等信息。当线程调用方法时,会创建一个栈帧来存储该方法的信息。 - **本地方法栈(Native Method ...

    java多线程笔记

    在多线程环境下,多个线程可以并行地在单个进程中执行,使得程序能够同时处理多项任务。 Java中的线程是通过`Thread`类或实现`Runnable`接口来创建的。你可以直接继承`Thread`类并重写`run()`方法,或者创建一个...

    Java多线程编辑核心技术

    Java多线程是Java编程语言的重要特性之一,它允许开发者在单个程序中同时运行多个部分,这些部分可以并发执行。掌握Java多线程技术对于设计高效的并发程序、充分利用多核处理器资源、提高应用程序的执行效率至关重要...

    经典java多线程资料

    但在微观层面上,由于单个CPU在同一时刻只能执行一个线程,因此实际上各个线程是在轮换执行的,这种现象称为**伪并发**。 #### 二、启动线程的两种方式 1. **继承Thread类:** - 可以通过继承`Thread`类并重写`...

Global site tag (gtag.js) - Google Analytics