【发布时间】:2016-09-21 02:38:16
【问题描述】:
编辑:
正如@Petesh 所说,我达到了kern.num_taskthreads 限制,而不是整体线程限制,它限制了单个进程的线程数。
sysctl kern.num_taskthreads 是:
kern.num_taskthreads: 2048
当我使用 VM args -XX:ThreadStackSize=1g 时,我只能创建 122 个线程;使用-XX:ThreadStackSize=2g,创建了 58 个线程。很有道理。
但是还是很奇怪,不管我怎么改-Xss args,结果总是2031。 -Xss args 似乎只适用于我现在不确定的主线程。
原问题:
我进行了一项测试,以了解一个 JVM 可以创建多少个线程。而当我调整 JVM 参数时,-Xmx 和 -Xss,结果并没有改变。
代码如下:
public class ThreadTest {
public static void main(String[] args) {
int count = 0;
try {
while (true) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
TimeUnit.SECONDS.sleep(360);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
thread.start();
System.out.println(count);
}
} catch (Error e) {
e.printStackTrace();
}
}
}
以及操作系统信息:
- 型号名称:MacBook Pro
- 型号标识符:MacBookPro11,4
- 处理器名称:英特尔酷睿 i7
- 处理器速度:2.2 GHz
- 处理器数量:1
- 内核总数:4
- 二级缓存(每核):256 KB
- L3 缓存:6 MB
- 内存:16 GB
java版本:
➤ java -version
java version "1.8.0_60"
Java(TM) SE Runtime Environment (build 1.8.0_60-b27)
Dynamic Code Evolution 64-Bit Server VM (build 25.71-b01-dcevmlight-1, mixed mode)
sysctl kern.num_threads:
kern.num_threads: 10240
【问题讨论】:
-
听起来您遇到了
kern.num_taskthreads限制,而不是整体线程限制,它限制了单个进程的线程数。这个值不是可调的,不费吹灰之力。 -
根据设计,任何限制都会有特定于平台的实现细节。无论您得到什么数字或答案,都不要期望它们在跨平台或 Java 版本中保持稳定。
-
@Petesh 你是对的。还有一个问题,linux有这样的限制吗?
-
Linux 本身没有每个进程的线程限制。最大进程数将有效地为用户设置线程限制;
/proc/sys/kernel/threads-max是总体限制。 -
@Petesh 我刚刚使用 VM args 进行了另一项测试,
-XX:ThreadStackSize=4g,当我创建 24 个线程时出现错误;但是当我使用-Xss4g时,我在创建 2032 个线程时遇到了错误。你对这些差异有什么想法吗?
标签: java multithreading jvm