Java 一个进程支持多少个线程同时运行的测试 Java max running thread count test

测试一下一个Java程序能同时造多少个线程,一起运行。直到 java.lang.OutOfMemoryError: unable to create new native thread,看其它文章说 -Xms -Xmx设置heap的大小以及 -Xss 设置单个stack的大小对这个数有影响,我在 -Xms 10m,1g,6g -Xss170k, 10m,100m,都是在4075左右就OOM拉。测试环境,jdk1.8 ,mac os

/**
 * 测试最多能创建多少个线程
 * 4076
 * -Xms2g -Xmx2g -Xss512k
 * -Xms10m -Xmx10m -Xss170k
 *
 * @author LiXuekai on 2020/7/27
 */
public class Main {
    private static final ExecutorService service = Executors.newCachedThreadPool();
    private static final AtomicInteger count = new AtomicInteger();
    private static final CountDownLatch countDownLatch = new CountDownLatch(Integer.MAX_VALUE);

    /**
     * 直接造,sleep的停
     */
    @Test
    public void howMany0() {
        while (true) {
            new Thread(() -> {
                System.out.println("thread " + count.addAndGet(1));
                try {
                    TimeUnit.HOURS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }).start();
        }
    }

    /**
     * 用池子造,sleep的停下。
     */
    @Test
    public void howMany1() {
        int i = 0;
        while (true) {
            int index = i + 1;
            System.out.println("......................... index is " + index);
            service.execute(() -> {
                try {
                    TimeUnit.HOURS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
        }

    }

    /**
     * 直接造,await。
     */
    @Test
    public void howMany2() {
        while (true) {
            new Thread(() -> {
                System.out.println("thread " + count.addAndGet(1));
                try {
                    countDownLatch.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }).start();
        }
    }

    /**
     * 这个是不带停的吧,之前创建的线程都自己死掉了。
     */
    @Test
    public void howMany3() {
        while (true) {
            new Thread(() -> {
                System.out.println("thread " + count.addAndGet(1));
            }).start();
        }
    }
}

运行结果:

除了最后一个,前面的单个线程都阻塞的情况,大概都是到这个数就OOM了。

理论:

操作系统对一 个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。

说是这个值和环境差别很大,目前就一个测试环境,暂就这个测试结果吧。

 

有新发现了,再补充,还有什么招继续增加running/blocked thread count,可以指点一下。

©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页