昨天在本人windows机器(32位的 )上调试一个代码的时候报了一个如下错误
java.lang.OutOfMemoryError: unable to create new native thread
第一眼看上去是OOM,有点傻眼,因为我的内存启动参数是“-Xms1024m -Xmx1024m -Xss45m”,而我很清楚这个代码大概的内存消耗。奇怪的是进程还没退出,于是打开visualvm监控了一下,发现heap空间还有大量剩余。
于是把目光焦点放在了“unable to create new native thread.”
。
jvm 堆和栈内存还完全够用的情况下,出现OOM,是第一次注意(也许以前潜意识里,OOM肯定是heap或perm空间不够用了)。之前没分析这类错误,通过google大神,大概了解了一下错误所以在此记录一下。
大概的原因如下:
当我们在jvm里创建一个线程的时候同样会在OS里创建一个本地线程,本地线程使用的是进程最大空间里且是JVM之外的内存。一个本地线程的线程栈空间刚好是我们jvm里指定的Xss。
由此,网上查到的最大可创建线程数公式是:
(MaxProcessMemory – JVMMemory – ReservedOsMemory) / (ThreadStackSize) = Number of threads
MaxProcessMemory:进程最大寻址空间。
JVMMMEMORY:jvm的内存空间(堆+永久区)
ReservedOsMemory:操作系统预留内存
ThreadStackSize:XSS大小。
刚好本人这个启动参数里把Xss设置程了45m(因为有递归且不缺定深度),所以如果预估ReservedOsMemory是100的情况,可以创建的线程数量如下:
(2G-1024m-100m)/45m=20.
而本程序里需要创建的线程是不止20的,也难怪会爆出这个异常了。
后面本人通过修改Xss的参数,问题得到解决。网上也有说有其他的方式来避免,如果分析有错误之处,也请高手也可以出来拍拍砖。
另外我在本人64位的开发机赏试了下,-Xms1024m -Xmx1024m -Xss200m参数下开了几百个线程也没问题,不知道公式对不对,有说64位机器的进程最大内存空间是4G,如果真的是4G,显然不能创建这么多的。
另外补充以下几个OOM的类型:
1. java.lang.OutOfMemoryError: Java heap space 堆空间不足
2. java.lang.OutOfMemoryError: PermGen space 永久区不足
3. java.lang.OutOfMemoryError: Requested array size exceeds VM limit
4. java.lang.OutOfMemoryError: <reason> <stack trace> (Native method)
参考
http://www.openkb.org/java-out-of-memory-unable-to-create-new-native-thread/
http://www.blogjava.net/ldd600/archive/2009/09/25/296397.html
分享到:
相关推荐
该错误可以发生在 Java 堆、虚拟机栈、本地方法栈和直接内存等几个运行时区域中,本篇文章将分别对这几个区域的 OutOfMemoryError 异常进行详细的分析和解决。 一、 Java 堆溢出 Java 堆用于存储对象实例,只要...
* 原因分析:请求创建一个超大对象、超出预期的访问量/数据量、过度使用终结器、内存泄漏 * 解决方案:通过 -Xmx 参数调高 JVM 堆内存空间、检查大对象的合理性、添加机器资源、做限流降级、找到持有的对象、修改...
5. 类加载器(ClassLoader):JVM通过类加载器来加载.class文件,并将其转换成二进制字节流,然后转换为方法区内的运行时数据结构,最后生成在Java堆中唯一的java.lang.Class对象。 6. 执行引擎(Execution Engine...
正确设置这些参数能有效避免 `java.lang.OutOfMemoryError: PermGen space` 或 `java.lang.OutOfMemoryError: Metaspace` 错误。 三、JVM 如何设置虚拟内存JVM 的内存分为堆内存、栈内存、方法区(永久代或元空间)...
Hadoop是一个基于Apache的开源大数据处理框架,广泛应用于大数据处理、数据分析和机器学习等领域。然而,在使用Hadoop时,经常会遇到一些常见的问题,这些问题可能会导致Hadoop集群无法正常工作或者性能下降。因此,...
- **错误日志**:分析`java.lang.OutOfMemoryError`错误信息,确定哪部分内存出现问题。 - **内存分析工具**:如MAT(Memory Analyzer Tool)可以分析hprof文件,找出内存泄漏的原因。 8. **JIT编译器**: - **...
1. **`java.lang.OutOfMemoryError: Java heap space`**:这表示堆内存已满。通常,这可能是由于项目中引用了大量的jar包或其他资源导致内存使用超出预期。可以通过调整JVM参数`-Xms`和`-Xmx`来增加堆内存的初始值和...
《深入理解Java虚拟机》是Java开发者不可或缺的一本技术书籍,它揭示了Java程序运行时的内部机制,包括内存管理、类加载机制、字节码执行、垃圾收集等核心概念。下面将根据提供的信息,详细阐述Java虚拟机(JVM)的...