Exception in thread “main” java.lang.OutOfMemoryError: unable to create new native thread
无意间遇到过这样的异常
意思是没法创建新的线程,线程肯定需要空间存储,但是线程的空间占用并不是Jvm本身内存空间
线程可以使用的空间:
MaxProcessMemory – JVMMemory – ReservedOsMemory
MaxProcessMemory 指的是一个进程的最大内存
JVMMemory JVM内存
ReservedOsMemory 保留的操作系统内存
线程数:
(MaxProcessMemory – JVMMemory – ReservedOsMemory) / (ThreadStackSize) = Number of threads
因为我们Jvm使用太大内存或者创建的线程太多都可能触发上面的异常
举个简单的demo:
/** * @author wangmingxin03 * Created on 2022-06-07 */ public class ThreadTest { public static void main(String[] args) { AtomicLong counter = new AtomicLong(); while (true) { new Thread(() -> { try { Thread.sleep(5000L); } catch (InterruptedException e) { e.printStackTrace(); } }).start(); System.out.println("start thread ... " + counter.incrementAndGet()); } } }
创建了4000多个线程,空间撑不住了,抛异常
除了上面的问题之外,我们还可能会遇到一些:
- OutOfMemoryError:Metaspace
元空间内存溢出
- StackOverFlowError
栈内存溢出,线程不停的做方法调用
- OutOfMemoryError
最常见的
一般有Java heap space、Direct buffer memory、Gc overhead limit exceeded、PermGen space
说点什么
您将是第一位评论人!