2回复
2年前
通过调整JVM Stack大小来验证最大线程数相关问题
本机物理内存32G,通过-Xss参数设定线程栈的大小为500MB.理论上来说,最多应该只可创建64(32/0.5)个左右的线程,但是为什么实际上在创建400多个线程时,依然没有出现OOM异常?线程栈内存空间不应该是在线程创建启动后即会被分配给该线程么?
下面是一个简单的测试用例
/**
* 栈空间分配失败发生OOM(OutOfMemoryError)异常
* VM args: 栈容量 -Xss500m -XX:+PrintCommandLineFlags -XX:+PrintFlagsFinal
*/
public class StackOOM2 {
public static void main(String[] args) {
new StackOOM2().test();
}
public void test() {
int i = 1;
while (true) {
i++;
Thread thread = new Thread( ()->{
loop();
},"#"+i);
thread.start();
System.out.println("线程总数: " + i);
if (i == 400) {
System.out.println("i : " + i);
}
}
}
private void loop() {
while (true) {
}
}
}
实际测试结果表明,至少可以创建400个线程。与此同时,ThreadStackSize
参数的值已经被设定为512000(Unit: KB) (512000KB=500*1024KB=500MB),说明实际上VM参数设定是生效的
其他环境参数如下所示:
OS: macOS 10.15.5
3028 阅读