性能问答>通过调整JVM Stack大小来验证最大线程数相关问题>
2回复
2年前

通过调整JVM Stack大小来验证最大线程数相关问题



本机物理内存32G,通过-Xss参数设定线程栈的大小为500MB.理论上来说,最多应该只可创建64(32/0.5)个左右的线程,但是为什么实际上在创建400多个线程时,依然没有出现OOM异常?线程栈内存空间不应该是在线程创建启动后即会被分配给该线程么?

下面是一个简单的测试用例

image.png

/**
 * 栈空间分配失败发生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参数设定是生效的

image.png

image.png

其他环境参数如下所示:

OS: macOS 10.15.5

image.png

3028 阅读
请先登录,查看2条精彩评论吧
快去登录吧,你将获得
  • 浏览更多精彩评论
  • 和开发者讨论交流,共同进步