我使用以下代码来测试最大线程数,但这很奇怪。
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
操作系统为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 个左右。
-Xss确定 Java 线程的最大堆栈大小。当一个线程启动时,操作系统会为这个大小的堆栈创建一个虚拟内存区域,但该内存不会立即分配到物理 RAM 中。
物理页面在第一次访问该页面的内存时被延迟分配。只要您的线程不调用深层方法,它们就不会使用所有堆栈空间。这就是为什么在 RAM 中只分配少数底部堆栈页面的原因,无论-Xss设置如何。
Linux默认启用内存过量使用。这意味着,它允许提交比物理 RAM 数量更多的虚拟内存(只要该虚拟内存实际上不受物理页面的支持,就像您的情况一样)。
因此,在您的情况下OutOfMemoryError,不是因为堆栈空间而抛出,而是由于其他操作系统限制之一:
ulimit -usysctl kernel.pid_maxsysctl kernel.threads-max也可以看看:
| 归档时间: |
|
| 查看次数: |
96 次 |
| 最近记录: |