openjavas 2010-12-16 17:35
浏览 655
已采纳

JVM线程数限制

public class MaxThreadsTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        while (true) {
            new Thread(new A()).start();
            if(A.eflag.get()){
                return;
            }
        }

    }

}

class A implements Runnable {
    static AtomicInteger counts = new AtomicInteger(0);
    static AtomicBoolean eflag = new AtomicBoolean(false);

    @Override
    public void run() {
        try {
            int x = counts.getAndIncrement();
            if(x%200==0)
                System.out.println("conts: " + A.counts);
            Thread.sleep(30000);
        } catch (InterruptedException e) {
            eflag.set(true);
            e.printStackTrace();
            
        }
    }
}


-Xms16M -Xmx32M -Xss1M -XX:+HeapDumpOnOutOfMemoryError
conts: 1801
Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread


-Xms32M -Xmx64M -Xss1M -XX:+HeapDumpOnOutOfMemoryError
conts: 1801
Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread


//把Xmx设大可以建立的线程数反而变小,这是个很奇怪的事情:
-Xms64M -Xmx128M -Xss1M -XX:+HeapDumpOnOutOfMemoryError
conts: 1601
Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread

//把Xmx设大可以建立的线程数反而变小,这是个很奇怪的事情:
-Xms128M -Xmx256M -Xss1M -XX:+HeapDumpOnOutOfMemoryError
conts: 1601
Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread


//把Xss设小有惊人效果:
-Xms16M -Xmx32M -Xss128K -XX:+HeapDumpOnOutOfMemoryError
conts: 13401
Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread



以上是在eclipse里测试的。

在windows下直接测试有明显不同。
java MaxThreadsTest -Xms16M -Xmx32M -Xss1M
java MaxThreadsTest -Xms64M -Xmx128M -Xss1M
无论怎么设置都在5401后结束。


我对JVM的了解基本为0,所以也分析不出原因。
请大家帮我看看,这是怎么回事,不是说Xmx越大、Xss越小,则线程数越多么?

 

被移到问答区里了,这么低的悬赏,能有人关注吗?

没办法了,就这么点钱啦……………………………………………………………………

 

  • 写回答

3条回答 默认 最新

  • Wang_Cheng_Bing 2010-12-17 13:40
    关注

    你的操作系统的内存是多少?
    在java中每new一个线程,jvm都是向操作系统请求new一个本地线程,此时操作系统会使用剩余的内存空间来为线程分配内存,而不是使用jvm的内存。这样,当操作系统的可用内存越少,则jvm可用创建的新线程也就越少。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?
  • ¥15 乘性高斯噪声在深度学习网络中的应用
  • ¥15 运筹学排序问题中的在线排序
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
  • ¥30 求一段fortran代码用IVF编译运行的结果
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛