public class Test { static int max = 0; public static void main(String[] args) { new Test().test();
} public void test() {
for (int i = 0; i < 20000; i++) {
Thread thread = new TestThread();
thread.setName(String.valueOf(i));
thread.start();
max = i > max ? i : max;
}
} class TestThread extends Thread {
public void run() {
while (true) {
try {
Thread.sleep(1000);
System.out.println(max);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}}在我的笔记本上执行这段代码,max到最后会停在7229上
创建线程的循环还没有结束,那是什么使它阻塞了呢?为什么没报错呢
可能是windows操作系统的限制?
而且给它分配的内存越多,最大线程数越低,谁能帮解释一下
} public void test() {
for (int i = 0; i < 20000; i++) {
Thread thread = new TestThread();
thread.setName(String.valueOf(i));
thread.start();
max = i > max ? i : max;
}
} class TestThread extends Thread {
public void run() {
while (true) {
try {
Thread.sleep(1000);
System.out.println(max);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}}在我的笔记本上执行这段代码,max到最后会停在7229上
创建线程的循环还没有结束,那是什么使它阻塞了呢?为什么没报错呢
可能是windows操作系统的限制?
而且给它分配的内存越多,最大线程数越低,谁能帮解释一下
解决方案 »
- 关于定时器的返回
- 这为什么不能用nextLine()?
- 缴费金额必须填写,不能为0,但可以为负数,有没有这个FORM的验证或是java代码
- java.net.UnknownHostException 提示Thrown to indicate that the IP address of a host could not be determined.
- 怎样才能使面板具有伸缩功能?
- 问个基础问题:ARRAYLIST.REMOVE(I)
- JList的焦点问题!?!
- Java中有什么方法判断字节中的每一个bit位是0还是1?
- 为什么多了一句package程序运行差别那么大(高手请进)
- 近期发现网页上有.cfm扩展名的网站!.cfm是什么格式!用java开发的吗?
- 求教数组小程序
- 关于JTextComponent失去焦点时的一些问题
不过你没有捕获main里的异常
在创建7230线程的时候,抛出了下面的异常,main已经退出了。
java.lang.OutOfMemoryError: unable to create new native thread
at java.lang.Thread.start0(Native Method)
at java.lang.Thread.start(Thread.java:597)
at test.Test.test(Test.java:26)
at test.Test.main(Test.java:11)
创建线程的循环还没有结束,那是什么使它阻塞了呢?为什么没报错呢你没发现一开始就打印内存溢出嘛,其实早在你的7299的时候已经停止创建线程的,每个电脑上的最大不同,为什么我也不知道,
那为什么还在阻塞了,那时因为你在run方法里用了while(true)死循环,7299个启动线程一直都在死循环的打印max值。
把while条件出掉,其实max就是你的7299。
(MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = Number of threads
MaxProcessMemory 一个进程的最大内存
JVMMemory JVM内存
ReservedOsMemory 保留的操作系统内存
ThreadStackSize 线程栈的大小MaxProcessMemory在相同的操作系统下是固定的,貌似Win32下是2G,所以基本上能创建的内存数也很固定。至于其他的怎么改,我也说不好,想要多创建点线程可以了解一下。
现在还不明白的是,通过-Xmx设置内存越大,创建的线程数反而越小
改 Xmx 的 JVM 参数是没用的,要想创建更多的线程得减少 Xss JVM 参数的值,这是线程栈的大小,数值越小所能创建的线程数就越多,在 Win 32 平台上默认一个线程占用 320k 的空间,而操作系统 Windows 分配给每个线程的空间是 1MB。由于操作系统的限制在 Windows 上每个进程所能创建的线程数在 2000 个左右!不知道怎么会创建出 7000 多个线程,竟然还有 15000 个的。估计是对象创建了,而线程被 OS 给拒了。
到底是320k还是1M呢?1M哪来的呢?