【发布时间】:2020-11-02 18:11:13
【问题描述】:
我用下面的代码来测试最大线程数,但是很奇怪。
import java.util.concurrent.atomic.AtomicInteger;
public class TestThread extends Thread {
private static final AtomicInteger count = new AtomicInteger();
public static void main(String[] args) {
try{
while (true) {
(new TestThread()).start();
}
} catch (Error | Exception e) {
System.out.println(e.getMessage());
}
}
@Override
public void run() {
System.out.println(count.incrementAndGet());
while (true)
try {
Thread.sleep(Integer.MAX_VALUE);
} catch (InterruptedException e) {
break;
}
}
}
操作系统是ubuntu:18.04,内存是4G,处理器数量是2。 JDK:openjdk1.8.0_252
java -Xss1m -Xms1024m -Xmx1023m TestThread
java -Xss512k -Xms1024m -Xmx1023m TestThread
java -Xss1m -Xms2048m -Xmx2048m TestThread
在结果中,线程数总是等于 10000 左右。
- 为什么结果是一样的。
- 我在命令中设置了-Xss1m,是不是意味着每个线程只有1m内存? 如果是单独内存的话,第10000个线程就有10G内存,实际上机器只有4G内存。
【问题讨论】:
-
1.它记录什么错误消息? 2.你有多少总内存(ram+swap)?
-
错误信息是OOM无法创建新的原生线程。我在 ubuntu 中打印顶部。 KiB Mem:总计 4015860,1923636 免费,1429424 已使用,662800 buff/cache; KiB Swap:总共 1942896 个,1942896 个免费,0 个已使用,2336928 个可用内存
-
ulimit -u 是 15511
-
这很有趣,有几件事可以限制你可以创建的线程数,但很难说你打的是哪一个。您是否看到生成了 hs_err_pid 日志文件?