点击上方“方志朋”,选择“置顶公众号”

技术文章第一时间送达!

原文:www.jb51.net/article/49087.htm

McGovernTheory在StackOverflow提了这样一个问题:

Java虚拟机最多支持多少个线程?跟虚拟机开发商有关么?跟操作系统呢?还有其他的因素吗?

Eddie的回答:

这取决于你使用的CPU,操作系统,其他进程正在做的事情,你使用的Java的版本,还有其他的因素。我曾经见过一台Windows服务器在宕机之前有超过6500个线程。当然,大多数线程什么事情也没有做。一旦一台机器上有差不多6500个线程(Java里面),机器就会开始出问题,并变得不稳定。

以我的经验来看,JVM容纳的线程与计算机本身性能是正相关的。

当然了,你要有足够的本机内存,并且给Java分配了足够的内存,让每个线程都可以拥有栈(虚拟机栈),可以做任何想做的事情。任何一台拥有现代CPU(AMD或者是Intel最近的几代)和1-2G内存(取决于操作系统)的机器很容易就可以支持有上千个线程的Java虚拟机。

如果你需要一个更精确的答案,最好是自己做压测。

Charlie Martin的回答:

这里有很多的参数(可以设置)。对于特定的虚拟机,都会有自己的运行时参数。(最大线程数)一定程度上由操作系统决定的:底层的操作系统要给线程提供哪些支持?施加哪些限制?虚拟机使用的是原生的操作系统的线程还是red thread或者green thread?

操作系统提供的支持是另一个问题。如果你向下面这样写Java程序:

class DieLikeADog {public static void main(String[] argv){for(;;){new Thread(new SomeRunaable).start();}}}

(不要抱怨语法细节,这才刚刚开始)那你当然希望能得到成百上千个运行的线程。但是,创建一个线程的成本是相对较大的,(过多线程)调度的开销会变得突出。能否让这些线程做有用的事情还不确定。

升级版

好了,迫不及待了!下面是我的一个加了点润色的小的测试程序:

public class DieLikeADog {private static Object s = new Object();private static int count = 0;public static void main(String[] argv){for(;;){new Thread(new Runnable(){public void run(){synchronized(s){count += 1;System.err.println("New thread #"+count);}for(;;){try {Thread.sleep(1000);} catch (Exception e){System.err.println(e);}}}}).start();}}
}

在Intel的OS/X 10.5.6系统上,Java 5的输出如下:

New thread #2547
New thread #2548
New thread #2549
Can't create thread: 5
New thread #2550
Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native threadat java.lang.Thread.start0(Native Method)at java.lang.Thread.start(Thread.java:592)at DieLikeADog.main(DieLikeADog.java:6)

benjismith的回答:

读了Charlie Martin的回复以后,我很想知道堆内存的大小是否能够给创建的线程数带来不同,然后我就被结果惊呆了:在Vista Home Premium SP1系统上,使用JDK 1.6.0_11,设置堆内存的大小从2M到1024M来执行Charlie的测试程序。比如:创建2M的堆内存,我使用的虚拟机参数是:-Xms2m -Xmx2m.

下面是我的测试结果:

2 mb --> 5744 threads
4 mb --> 5743 threads
8 mb --> 5735 threads
12 mb --> 5724 threads
16 mb --> 5712 threads
24 mb --> 5687 threads
32 mb --> 5662 threads
48 mb --> 5610 threads
64 mb --> 5561 threads
96 mb --> 5457 threads
128 mb --> 5357 threads
192 mb --> 5190 threads
256 mb --> 5014 threads
384 mb --> 4606 threads
512 mb --> 4202 threads
768 mb --> 3388 threads
1024 mb --> 2583 threads

所以,堆的大小确实很重要。但是,堆大小和最大线程数却是呈反比例关系。

这太诡异了!

Neil Coffey的回答:

绝对理论上的最大线程数是进程的用户地址空间除以线程栈的大小(现实中,如果内存全部给线程栈使用,就不会有能运行的程序了)。因此,以32位Windows系统为例,每一个进程的用户地址空间是2G,假如每个线程栈的大小是128K,最多会有16384(=210241024 / 128)个线程。实际在XP系统上,我发现大约能启动13000个线程。

然后,我认为,你的问题本质上是:(a)你是否可以在你的代码中有效的管理许多的线程,不让他们做很显然是愚蠢的事情(比如:让他们在同一个object对象上等待随后被调用notifyAll()…),(b)操作系统是否可以有效地管理这许多线程。基本上来说,如果(a)的答案是”yes”的话,(b)的答案也是”yes”。

很巧的是,你可以在Thread的构造函数中设置线程栈的大小,但是,你不需要也不应该把这个和虚拟机参数弄混淆。

原文:www.jb51.net/article/49087.htm

热门内容:

  • 微服务架构之「 容错隔离 」

  • Sharding-jdbc教程:Mysql数据库主从搭建

  • 谈谈服务雪崩、降级与熔断

  • 从零开始搭建创业公司后台技术栈

  • 基于SpringBoot开发一个Restful服务,实现增删改查功能

  • 开发者说:基于 Nacos 的网关灰度路由和服务权重灰度

  • 如何在微服务架构中实现安全性?

  • Spring Cloud Alibba教程:Sentinel的使用

感谢搓一下“在看

JVM最多支持多少个线程?相关推荐

  1. JVM 最多支持多少个线程?

    McGovernTheory在StackOverflow提了这样一个问题: Java虚拟机最多支持多少个线程?跟虚拟机开发商有关么?跟操作系统呢?还有其他的因素吗? Eddie的回答: 这取决于你使用 ...

  2. Java虚拟机最多支持多少个线程的探讨

    点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 来源 | jb51.net/article/49087.htm McGovernTheory ...

  3. java虚拟机线程数_Java虚拟机最多支持多少个线程?

    作者:miracle1919  来源:http://sina.lt/getP McGovernTheory在StackOverflow提了这样一个问题:Java虚拟机最多支持多少个线程?跟虚拟机开发商 ...

  4. JVM性能调优监控工具专题二:VisualVM基本篇之监控JVM内存,CPU,线程

    2019独角兽企业重金招聘Python工程师标准>>> JVM性能调优监控工具专题二:VisualVM基本篇之监控JVM内存,CPU,线程 博客分类: java jvm 前言: 上一 ...

  5. sql 时间范围查询_Excel中使用SQL查询,单元格范围最多支持65536行?

    1.先建立一个excel,本人的版本为2016 2.然后向下填充数字,操作为填充--序列 这样生成1-66666的序列 3.使用SQL查询语句,进行查询 使用语句 : select 序列 from [ ...

  6. 可遇不可求的Question之不支持一个STA 线程上针对多个句柄的WaitAll

    不支持一个 STA 线程上针对多个句柄的 WaitAll. 题设: 在.NET开发多线程控制台程序过程中,由于业务要求,需要实现"一次扫描多笔订单",然后,通过多线程实现并发提交的 ...

  7. WPF 不支持从调度程序线程以外的线程对其 SourceCollection 进行的更改

    该问题出现在WPF中的VM类中,ObservableCollection类型,该类型的 CollectionView 不支持从调度程序线程以外的线程对其 SourceCollection 进行的更改, ...

  8. Python 多线程 threading.Thread 同时最多有 n 个线程

    Regular无限多线程 import threading import numpy as np import timeclass BuildThread(threading.Thread):def ...

  9. Line推出新语音群聊功能 最多支持200人

    3月11日,据科技博客VentureBeat报道,日本移动通讯巨头Line公司近日宣布,为支持企业电话会议,该公司将在最新版Line应用中增加语音群聊功能,最多支持200人同时群聊. Line的这项新 ...

最新文章

  1. 实用插件_这些实用的PR插件你知道吗?
  2. Sprint(第一天11.14)
  3. 了解员工工作的四种方法
  4. MySQL各部门求最值_mysql 求分组最大值的十个解法
  5. Linux系统调优概述
  6. 【深入Cocos2d-x】探索Cocos2d-x中的内存管理-引用计数和自动释放池
  7. object数据类型
  8. php5.4 windows2003,PHP实战:Windows2003下php5.4安装配置教程(IIS)
  9. 根文件系统定制【ZT】
  10. poj 楼天成的男人八题系列 A New Stone Game 博弈问题
  11. 图片拉伸和保持长宽比的问题
  12. 9.FLINK Sink\API\自定义sink
  13. 网站QQ扫码登录代码及详细说明
  14. 前端面试题汇总及答案十二
  15. 用PyOpenGL叩开3D的心扉——OpenGL全解析(1)
  16. Scratch中基本演绎法小故事
  17. 计算机系统千年虫问题
  18. DataFrame的数据处理笔记
  19. ros摄像头参数标定
  20. Axure 运行开发工具

热门文章

  1. 关于DWG文件转换成PDF
  2. [C#][EF] 添加表添加不进来
  3. 电热水器技术性能指标
  4. JavaScript学习笔记 - 入门篇(1)- 准备
  5. NEWS - InstallShield 2013 SP1发布
  6. WinRAR也能实现智能备份
  7. 限制程序只打开一个实例(转载)
  8. 刚开始Windows Mobile的开发,请大家多多关照
  9. 【青少年编程竞赛交流】12月份微信图文索引
  10. 刻意练习:LeetCode实战 -- Task15. 有效的括号