单个进程最大线程数

单个进程最大线程数 博客分类: 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
 
系统限制
 系统最大可开线程数
 

posted on 2017-02-06 15:06  石下江的太阳光  阅读(500)  评论(0编辑  收藏  举报

导航