zoukankan      html  css  js  c++  java
  • 一台服务器最多可以有多少Java线程

    背景:

      最近被问到【一台服务器最多可以有多少Java线程】的问题,大概知道跟计算机硬件、内存等有关系,每个线程都有独自的java虚拟机栈,应该虚拟机栈的大小,决定了有多少线程。详情就不太清楚了。

    求真过程:

    1.跟内存的堆大小、虚拟机栈Xss大小有关系

    每个线程都有一个线程栈空间通过-Xss设置,查了一下我们服务器的关于jvm内存的配置

    -Xms4096m

    -Xmx4096m

    -XX:MaxPermSize=1024m

    只有这三个,并没有-Xss 和-XX:ThreadStackSize的配置,因此是走的默认值。几种JVM的默认栈大小

     
    用如下命令打印,linux服务器 虚拟机栈大小
    java -XX:+PrintFlagsFinal -version | grep ThreadStackSize

    如下图,是1M

     实际上,计算线程数,有个通用公式

    下面是一个相对比较精准的计算线程数量的公式,其中ReservedOsMemory是系统保留内存,一般在136MB左右:
    
    线程数量 = (最大地址空间(MaxProcessMemory) - JVM堆内存 - ReservedOsMemory) / ThreadStackSize(XSS)

    比如我们的容器本身大小是8G,堆大小是4096M,走-Xss默认值,可以得出 最大线程数量:4096个。

    根据计算公式,内存一定的情况下,得出如下结论:

    结论1:jvm堆越大,系统创建的线程数量越小。

    结论2:当-Xss的值越小,可生成线程数量越多。

    2.跟操作系统内核配置也会影响线程数

    线程数量还与操作系统的一些内核配置有很大的关系。例如Linux下:

    • /proc/sys/kernel/pid_max 增大,线程数量增大,pid_max有最高值,超过之后不再改变,而且32,64位也不一样
    • /proc/sys/kernel/thread-max 系统可以生成最大线程数量
    • max_user_process(ulimit -u)centos系统上才有,没有具体研究
    • /proc/sys/vm/max_map_count 增大,数量增多

     线程是非常宝贵的资源,我们要严格控制线程的数量

    参考:

    https://blog.csdn.net/qq_30038111/article/details/83270147

    https://www.cnblogs.com/cheyunhua/p/11043997.html

    ==========================================================================           如果您觉得这篇文章对你有帮助,可以【关注我】或者【点赞】,希望我们一起在架构的路上,并肩齐行
    ==========================================================================
  • 相关阅读:
    Mysql -- SQL常用命令实例
    JavaWeb -- 文件上传下载示例
    Java -- 利用反射 操作任意数组,包括对象数组 和 基本数据类型的数组
    JavaWeb -- 自定义标签实例, 防盗链, JSTL 核心标签
    JavaWeb -- Jsp 自定义标签的使用
    JavaWeb -- http-equiv=refresh跳转的时候出现Session 丢失, 解决办法。。
    JavaScript -- 正则表达式 检验表单提交的内容
    FSG压缩壳和ImportREC的使用
    愉快的开始
    学习Python的捷径
  • 原文地址:https://www.cnblogs.com/amberJava/p/13261279.html
Copyright © 2011-2022 走看看