单个进程最大线程数
单个进程最大线程数 博客分类: j2se
线程 .
原文链接:http://jzhihui.iteye.com/blog/1271122
windows 操作系统中允许的最大线程数。
===========================================================================
默认情况下,一个线程的栈要预留1M的内存空间
而一个进程中可用的内存空间只有2G,所以理论上一个进程中最多可以开2048个线程
但是内存当然不可能完全拿来作线程的栈,所以实际数目要比这个值要小。
你也可以通过连接时修改默认栈大小,将其改的比较小,这样就可以多开一些线程。
如将默认栈的大小改成512K,这样理论上最多就可以开4096个线程。
即使物理内存再大,一个进程中可以起的线程总要受到2GB这个内存空间的限制。
比方说你的机器装了64GB物理内存,但每个进程的内存空间还是4GB,其中用户态可用的还是2GB。
如果是同一台机器内的话,能起多少线程也是受内存限制的。每个线程对象都要站用非页面内存,而
非页面内存也是有限的,当非页面内存被耗尽时,也就无法创建线程了。
如果物理内存非常大,同一台机器内可以跑的线程数目的限制值会越来越大。
在Windows下写个程序,一个进程Fork出2000个左右线程就会异常退出了,为什么?
这个问题的产生是因为windows32位系统,一个进程所能使用的最大虚拟内存为2G,而一个线程的
默认线程栈StackSize为1024K(1M),这样当线程数量逼近2000时,2000*1024K=2G(大约),
内存资源就相当于耗尽。
附:Win32将低区的2GB留给进程使用, 高区的2GB则留给系统使用。
Linux将高位1GB留给内核,低位3GB留给进程
?
linux系统中允许的最大线程数
==========================================================================================
JVM中可生成的最大Thread数量
JVM中可以生成的最大数量由JVM的堆内存大小、Thread的Stack内存大小、系统最大
可创建的线程数量(Java线程的实现是基于底层系统的线程机制来实现的,Windows下_beginthreadex,Linux下pthread_create)三个方面影响。
最近想测试下Openfire下的最大并发数,需要开大量线程来模拟客户端。对于一个JVM实例到底能开多少
个线程一直心存疑惑,所以打算实际测试下,简单google了把,找到影响线程数量的因素有下面几个:
-Xms
intial java heap size
-Xmx
maximum java heap size
-Xss
the stack size for each thread
系统限制
系统最大可开线程数