Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么-Xss不增加创建的线程数?_Java_Multithreading_Memory_Jvm - Fatal编程技术网

Java 为什么-Xss不增加创建的线程数?

Java 为什么-Xss不增加创建的线程数?,java,multithreading,memory,jvm,Java,Multithreading,Memory,Jvm,我需要一些关于如何最好地调整内存设置以允许更多线程的输入 我通读了上面的文章,并遵循了java示例(dieLikeaDog),它确实有效,在死亡之前生成了不到800个线程 与上面的(dieLikeaDog示例)链接一样,代码生成它所能生成的所有线程,直到出现以下错误结果:java.lang.OutOfMemoryError:无法创建新的本机线程 在命令行上指定Xss(例如java-Xss104k dieLikeADog)不会更改创建的线程数 我还尝试更改-Xms和-Xmx,但都没有更改它可以生成

我需要一些关于如何最好地调整内存设置以允许更多线程的输入

我通读了上面的文章,并遵循了java示例(dieLikeaDog),它确实有效,在死亡之前生成了不到800个线程

与上面的(dieLikeaDog示例)链接一样,代码生成它所能生成的所有线程,直到出现以下错误结果:java.lang.OutOfMemoryError:无法创建新的本机线程

在命令行上指定Xss(例如java-Xss104k dieLikeADog)不会更改创建的线程数

我还尝试更改-Xms和-Xmx,但都没有更改它可以生成的线程数

改变线程数量的一件事是my-u ulimit(用于max用户进程)。使其更大确实增加了线程的数量

我的建议如下:

$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 46588
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1024
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
在阅读其他示例时,我有点困惑,因为我认为指定较小的-Xss应该增加线程的数量

是否还有其他原因阻止Xss工作

如果有必要,我运行的是64位fedora 15系统(具有6 Gig的ram):


-Xss
参数控制如何为每个线程的堆栈分配mush内存。选择一个值就是平衡堆栈深度和可用内存的情况。将值设置为
-Xss104k
意味着启动的每个线程的堆栈将消耗104KB的可用内存(使用
-Xmx
设置)。如果从
-Xmx1024k
开始,那么在达到10个线程之前,内存将耗尽,因为这1M内存包括堆和类(permgen)以及线程堆栈

我的方法是首先检查要在线程中运行的代码。递归重代码需要更多的堆栈。只需迭代大量数据的代码可能只需要很少的堆栈

平衡相关作用力的一种经验方法是减小
-Xss
,直到得到
堆栈溢出错误。这意味着您的线程正在耗尽堆栈。为最后一个有效的值添加一些填充。如果未导致堆栈溢出错误的最后一个值是“-Xss1k
,则try
-Xss2k
-Xss3k
。如果堆栈在类似于
10k
的地方消失,我会尝试跳到
15k`

现在您有了线程堆栈的大小。总内存(
-Xmx
)减去permgen,再减去所需的堆数量,就可以得到线程的剩余内存。如果heap需要1000K,permgen需要50K,并且堆栈大小为2K,那么要运行十个线程,您需要的最小内存是
-Xmx1070K

这就是说,看看你在努力完成什么。为什么需要更多的线程?也许答案不是更多的线程,而是一种不同的算法,它可以在使用更少线程的情况下更快地处理数据

更新

我已经删除了我原来答案中发现不正确的部分

堆栈空间不是从堆空间获取的,而是单独分配的。 线程堆栈和堆都计入进程的虚拟内存。减少堆允许更多线程,增加堆允许更少线程

在32位JVM上,我能够将堆栈大小减少到1K。 在64位JVM上,104K是最小值

我在64位Windows7机器上做了一些测试,它有4G内存和2个内核

使用32位JVM、
-Xss8k
-Xmx128m
程序可以提供约5000个线程。这似乎是最好的情况。我没有找到一个组合的选项,将增加线程数超过这一点。如果我增加堆大小,最大线程数就会下降。线程堆栈大小似乎与系统页面大小有关,因为如果选择小于8k的堆栈,最大线程数实际上会变得更糟

Ubuntu Quantal上32位JVM的~5000线程限制似乎也适用

对于64位JVM,情况就完全不同了。使用
-Xss104k
-Xmx128m
程序超过50000个线程。在这一点上,Windows变得非常不高兴。它停止响应几分钟,然后开始终止其他进程。我猜是为了释放更多的内存

更新:


在Ubuntu上的更多测试:我发现我有一个虚拟内存的ulimit设置。在
ulimit-v unlimited
之后,程序最多可执行36000个线程

原因可能在于您提供的ulimit:

max user processes              (-u) 1024
每个线程都将根据该值计数。由于您不仅在运行JVM,很多线程已经从该值中扣除

尝试执行

ulimit -u 4000

然后重新运行测试(在您执行命令的shell中!),您可以创建的线程数量不应该增加。

死亡的原因是什么?也许只是记性不够?尝试增加-xmx好问题。如上所述,我尝试更改-Xms和-Xmx,但都没有更改它可以生成的线程数。关于您得到的消息,如上面的(dieLikeaDog示例)链接中所示,代码会生成它所能生成的所有线程,直到出现以下错误结果:java.lang.OutOfMemoryError:无法创建新的本机线程看起来是某个东西(不是线程)消耗了所有内存。为了确保这一点,可以尝试使用-Xms来减少线程的堆栈内存。试着用内存分析工具找出问题所在。当它停止时,我有6亿的可用内存。当我们在一台拥有16 Gig内存的类似机器上运行时,它在相同数量的线程上停止,因此在我看来,这不是空闲内存,而是系统设置或vm问题。正如我上面提到的,我们确实尝试过增加和减少-Xms,但没有效果。我们不能简单地只使用较少的线程,因为在我们的程序中有许多不同的应用程序运行,它们使用camel和jms(它们为侦听器等创建线程),而使用较小的线程
ulimit -u 4000