测试一下一个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,可以指点一下。