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操作系统的限制?
而且给它分配的内存越多,最大线程数越低,谁能帮解释一下

解决方案 »

  1.   

    这个有点儿意思。
    不过你没有捕获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)
      

  2.   

    我的在7037内存溢出,
    创建线程的循环还没有结束,那是什么使它阻塞了呢?为什么没报错呢你没发现一开始就打印内存溢出嘛,其实早在你的7299的时候已经停止创建线程的,每个电脑上的最大不同,为什么我也不知道,
    那为什么还在阻塞了,那时因为你在run方法里用了while(true)死循环,7299个启动线程一直都在死循环的打印max值。
    把while条件出掉,其实max就是你的7299。
      

  3.   

    目的是什么?测试win 下最大的 线程数?那你的把启动虚拟机的内存搞大点儿。
      

  4.   

    有什么不对的吗?这个确实是操作系统限制了可创建的线程数,你sleep了一会,所以基本上在最开始就会因为创建的线程过多而抛出 java.lang.OutOfMemoryError: unable to create new native thread 异常,之后main方法退出,但是线程并不会结束,如果不手动关掉线程,在线程执行完毕后会被垃圾回收器给回收掉,但你的线程用的是while(true)循环,并不会结束,更不会被回收,所以会一直打印max。顺便贴一下系统可以创建的线程数怎么算:
    (MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = Number of threads 
    MaxProcessMemory 一个进程的最大内存
    JVMMemory JVM内存
    ReservedOsMemory 保留的操作系统内存
    ThreadStackSize 线程栈的大小MaxProcessMemory在相同的操作系统下是固定的,貌似Win32下是2G,所以基本上能创建的内存数也很固定。至于其他的怎么改,我也说不好,想要多创建点线程可以了解一下。
      

  5.   

    我是准备做长连接测试的,所以在里面加了个while,不让线程退出
    现在还不明白的是,通过-Xmx设置内存越大,创建的线程数反而越小
      

  6.   

    看6楼公式,算的是剩余内存,JVMMemory越大能创建的线程数越小。所以增加可创建线程数的解决方案之一便是减少JVMMemory的分配。
      

  7.   


    改 Xmx 的 JVM 参数是没用的,要想创建更多的线程得减少 Xss JVM 参数的值,这是线程栈的大小,数值越小所能创建的线程数就越多,在 Win 32 平台上默认一个线程占用 320k 的空间,而操作系统 Windows 分配给每个线程的空间是 1MB。由于操作系统的限制在 Windows 上每个进程所能创建的线程数在 2000 个左右!不知道怎么会创建出 7000 多个线程,竟然还有 15000 个的。估计是对象创建了,而线程被 OS 给拒了。
      

  8.   


    到底是320k还是1M呢?1M哪来的呢?