java虚拟机能并发的启动多少个线程

新建一个类,导入如下的测试代码:

 1 public class TestNativeOutOfMemoryError {
 2     public static void main(String[] args) {
 3
 4         for (int i = 0;; i++) {
 5             System.out.println("i = " + i);
 6             new Thread(new HoldThread()).start();
 7         }
 8     }
 9
10 }
11
12 class HoldThread extends Thread {
13     CountDownLatch cdl = new CountDownLatch(1);
14
15     public HoldThread() {
16         this.setDaemon(true);
17     }
18
19     public void run() {
20         try {
21             cdl.await();
22         } catch (InterruptedException e) {
23         }
24     }
25 }

在我的开发环境上运行结果如下:

1 ......
2 i = 3935
3 Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread
4     at java.lang.Thread.start0(Native Method)
5     at java.lang.Thread.start(Thread.java:714)
6     at com.study.thinking.in.java.concurrent.TestNativeOutOfMemoryError.main(TestNativeOutOfMemoryError.java:15)

每次运行结果并不完全一致,但是大差不差。

影响结果的几个参数:

1. 物理内存
使用64位OS能给虚拟机分配更大内存
2.JVMMemory
减少这项参数能增加并发的线程数,非倍数关系
-Xms1024m -Xmx1024m并不能比-Xms512m -Xmx512m多一倍的线程
3.ThreadStackSize
减少单个线程的栈大小,在有效范围内,是倍数关系

更多消息参考:http://sesame.iteye.com/blog/622670

时间: 2024-10-10 09:16:48

java虚拟机能并发的启动多少个线程的相关文章

Java多线程与并发库高级应用之线程数据交换Exchanger

JDK1.5提供了Exchanger用于两个线程的数据交换.两个线程先后到达交换点,先到达的线程会等待后到达的线程,然后两个线程互相交换数据,交换后双方持对方的数据. Exchanger只提供了一个构造器: Exchanger():创建一个新的Exchanger. Exchanger中也只有两个方法: V exchange(V x): 等待另一个线程到达此交换点(除非当前线程被中断),然后将给定的对象传送给该线程,并接收该线程的对象. V exchange(V x, long timeout,

Java多线程与并发库高级应用-传统线程互斥技术

  /** * 启动两个线程分别打印两个名字,名字按照字符一个一个打印 * * @author Administrator * */ public class TraditionalThreadSynchronized { public static void main(String[] args) { new TraditionalThreadSynchronized().init(); } public void init() { final Outputer outputer = new

【Java多线程与并发库】4.传统线程同步通信技术

我们先通过一道面试题来了解传统的线程同步通信. 题目:子线程循环10次,接着主线程循环100次,接着又回到子线程循环10次,接着再回到主线程又循环100次,如此循环50次,请写出程序. 我没有看答案,先用自己的思路写了一段代码,有一些是借鉴传统的“生产者与消费者”的多线程模型写出来的:[java] view plain copy 在CODE上查看代码片派生到我的代码片package cn.edu.hpu.test; /** * 要求的操作: * 子线程循环10次,接着主线程循环100次,接着又回

Java多线程与并发库高级应用-java5线程并发库

java5 中的线程并发库 主要在java.util.concurrent包中 还有 java.util.concurrent.atomic子包和java.util.concurrent.lock子包

Java多线程与并发库高级应用-传统线程同步通信技术

面试题: 子线程循环10次,接着主线程循环100次,接着又回到子线程循环10次,接着又 主线程循环100次,如此循环50次,请写出程序 /** * 子线程循环10次,接着主线程循环100次,接着又回到子线程循环10次,接着又 主线程循环100次,如此循环50次,请写出程序 * * @author Administrator * */ public class TraditionalThreadCommunication { public static void main(String[] arg

Java多线程和并发(五),线程的状态

目录 1.线程的六个状态 2.sleep和wait的区别 3.锁池(EntryList)和等待池(WaitSet) 4.notify和notifyall的区别 五.线程的状态 1.线程的六个状态 2.sleep和wait的区别 3.锁池(EntryList)与等待池(WaitSet) 4.notify和notifyall的区别 原文地址:https://www.cnblogs.com/xzmxddx/p/10362813.html

Java多线程和并发(四),线程返回值获取方式和Callable接口

目录 1.主线程等待法 2.使用Thread类的join()阻塞当前线程,等待子线程执行完毕 3.通过Callable接口实现:通过FutureTask Or线程池获取 四.线程返回值获取方式和Callable接口 1.主线程等待法 public class CycleWait implements Runnable{ private String value; @Override public void run() { try { Thread.currentThread().sleep(50

启动三个线程A,B,C,按ABC的顺序输出10次

package jun; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /**  * 启动三个线程A,B,C,

java中的并发:进程和线程

1.简介 1)进程:同一个系统中执行的一个子程序,包含三部分:虚拟CPU,代码,数据. 2)线程:同一个进程中执行的子程序流. 3)进程让操作系统的并发性成为可能,而线程让进程的内部并发成为可能.一个进程虽然包括多个线程,但是这些线程是共同享有进程占有的资源和地址空间的.进程是操作系统进行资源分配的基本单位,而线程是操作系统进行调度的基本单位. 2.创建一个进程 2.1首先了解三个类    1)Process(抽象类)       进程类,提供了执行从进程输入.执行输出到进程.等待进程完成.检查