在java应用中,有时候会出现这样的错误:OutOfMemoryError: unable to create new native thread. |
---|
现象 |
1. 这种怪事是因为JVM已经被系统分配了大量的内存(比如1.5G),并且它至少要占用可用内存的一半; |
2. 在线程个数很多的情况下,你分配给JVM的内存越多,上述错误发生的可能性就越大。 |
分析 |
根据能够创建线程的最大个数的估算公式: |
(MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = Number of threads |
每一个32位的进程最多可以使用2G 的可用内存,因为另外2G 被操作系统保留。这里假设1.5G 给JVM,操作系统保留120M 内存: |
对于jdk1.5而言,栈大小为 1M |
1.5GB allocated to JVM: (2GB-1.5Gb-120MB)/(1MB) = ~380 threads |
1.0GB allocated to JVM: (2GB-1.0Gb-120MB)/(1MB) = ~880 threads |
对于jdk1.4而言,栈大小为 256KB |
1.5GB allocated to JVM: ~1520 threads |
1.0GB allocated to JVM: ~3520 threads |
方案: |
1. 减少分配给JVM的最大内存 |
2. 通过-Xss / -XX:ThreadStackSize 减少线程最大栈空间大小 |
2. 还有一种做法是让JVM宿主在你的JNI代码里边 |
参考: (java进程里如何估算jvm最大线程数)