OutOfMemoryError: unable to create new native threadjava
這個錯誤是因爲建立了太多的線程致使的。建立線程的數量能夠由下面公式計算出來:segmentfault
(MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = Number of threads MaxProcessMemory:進程最大尋址空間。 JVMMMEMORY:jvm的內存空間(堆+永久區)-Xmx大小 (應該是實際分配大小) ReservedOsMemory:操做系統預留內存 ThreadStackSize:-Xss大小
計算過程請參考:http://www.javashuo.com/article/p-wrvfheip-hc.htmlapp
重現該異常以下,jvm
import java.util.concurrent.CountDownLatch; class TestThread extends Thread { CountDownLatch count = new CountDownLatch(1); public TestThread() { this.setDaemon(true); } /** * 線程一直等待 */ @Override public void run() { try { count.await(); } catch (InterruptedException e) { e.printStackTrace(); } } } public class XssTest { public static void main(String args[]) { for (int i = 0; ; i++) { System.out.println("i = " + i); new Thread(new TestThread()).start(); } } }
運行結果:ide
i = 2027 Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread at java.lang.Thread.start0(Native Method) at java.lang.Thread.start(Thread.java:714) at XssTest.main(XssTest.java:37) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
---the stack size for each threadui
JDK5.0之後每一個線程堆棧大小爲1M,之前每一個線程堆棧大小爲256K。在相同物理內存下,減少這個值能生成更多的線程。可是操做系統對一個進程內的線程數仍是有限制的,不能無限生成。this
使用不一樣的Xss參數來運行下面這個程序,操作系統
public class XssDemo { private static int count = 0; public static void recursion() { //減小局部變量的聲明,能夠節省棧幀大小,增長調用深度 long a = 1, b = 2, c = 3, d = 4, e = 5, f = 6, q = 7, x = 8, y = 9, z = 10; count++; recursion(); } public static void main(String args[]) { try { recursion(); } catch (Throwable e) { System.out.println("deep of calling = " + count); // e.printStackTrace(); } } }
運行以下,線程
➜ helloworld java -Xmx128m -Xms128m -Xss1024k XssDemo deep of calling = 12401 ➜ helloworld java -Xmx128m -Xms128m -Xss512k XssDemo deep of calling = 3524
當線程棧設置的較大時,棧的深度會比較大。code
參見http://jzhihui.iteye.com/blog/1271122
-Xms
intial java heap size
-Xmx
maximum java heap size
-Xss
the stack size for each thread
===========END===========