转载自:http://blog.sina.com.cn/s/blog_684fe8af0100wzge.html
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虚拟机(JVM)的性能调优是非常重要的一环,特别是在处理大型应用程序或者服务时,合适的JVM调优能够显著提升系统性能和稳定性。本篇文档详细介绍了JVM调优工具的命令使用及其...
《Monkey老师的JVM调优深度解析》 在Java开发领域,JVM(Java Virtual Machine)是每一个程序员都需要深入了解的关键组成部分。Monkey老师的JVM调优课程,无疑为我们提供了一个宝贵的平台,来深入探究JVM的工作原理...
JVM调优总结 -Xms -Xmx -Xmn -Xss JVM 调优是 Java virtual machine 的性能优化,通过调整 JVM 的参数来提高 Java 应用程序的性能。其中,-Xms、-Xmx、-Xmn、-Xss 是四个重要的参数,分别控制 JVM 的初始堆大小、...
GC(Garbage Collection)调优和JVM调优是优化Java应用性能的关键环节,尤其是在处理大量数据或者高并发场景时显得尤为重要。 GC调优主要是对JVM的垃圾回收机制进行调整,以确保内存的有效利用和避免系统出现长时间...
Jstack命令可以生成线程dump文件,用于分析Java应用程序的线程信息。例如,使用Jstack命令可以找到占用CPU最高的堆栈信息。 HeapDumpOnOutOfMemoryError是JVM的一个参数,用于在内存溢出时自动导出堆dump文件。例如...
在这个全面理解JVM并掌握常规JVM调优的教程中,我们将深入探讨JVM的工作原理、内存模型、垃圾收集机制、类加载过程以及如何进行性能优化。 一、JVM工作原理 JVM的运行过程包括编译、加载、验证、解析、初始化、执行...
JVM 调优详解 JVM 调优是 Java 虚拟机(Java Virtual Machine)中的一种技术,用于优化 Java 应用程序的性能和内存使用。其中,垃圾回收(Garbage Collection)是 JVM 调优的重要组成部分,本文将详细介绍 JVM 调优...
JVM调优涉及到调整一系列参数,以优化应用程序的性能,包括内存分配、垃圾收集策略、线程管理以及编译器优化等。 【描述】"Jvm调优练习-jvm-tuning" 暗示了这个压缩包可能包含一系列实验或教程,帮助用户通过实际...
JVM调优涉及多个方面,包括内存配置、垃圾收集器选择、线程设置、类加载机制优化等。这里我们将详细探讨这些关键知识点,并结合提供的"生产环境jvm调优的实例代码-jvm.zip"中的内容进行深入讲解。 1. **内存配置**...
JVM调优前戏之JDK命令行工具 JVM调优前戏之JDK命令行工具是JDK中的一组命令行工具,用于监测JVM运行时的状态。这些工具对于普通开发人员来说可能不太熟悉,但它们却是JVM调优的重要步骤。在这篇文章中,我们将详细...
5. **线程与并行性能**:监控和调整线程池大小,优化并发执行效率,例如使用`-XX:ParallelGCThreads`指定并行GC线程数。 6. **监控与诊断工具**:JDK自带的JConsole、VisualVM、JProfiler等工具可以帮助我们实时...
并发编程允许程序同时执行多个任务,而JVM调优则能确保程序运行在最佳状态。下面,我们将深入探讨这两个领域的核心概念和实践技巧。 并发编程主要涉及以下几个知识点: 1. **线程与进程**:线程是程序执行的最小...
在对Java虚拟机(JVM)进行调优的过程中,我们首先...总体而言,JVM调优是一个系统化的过程,它需要对JVM的工作机制有深入的理解,并且结合实际应用进行测试和调优。有效的JVM调优能够显著提升Java应用的性能和稳定性。
选择合适的垃圾回收器和调整其参数是JVM调优的重要工作,比如可以通过-XX:+UseSerialGC、-XX:+UseParallelGC等选项来指定使用哪种收集器,同时需要根据应用程序的特性调整新生代、老年代和持久代的大小,以及垃圾...
JVM调优通常涉及以下几个方面:内存管理、垃圾收集策略、线程管理以及类加载机制等。有效的JVM调优能够显著提升Java应用的性能表现。 #### 二、JVM常见参数 ##### 堆栈相关 - **-Xss**:调整线程栈大小。线程栈...
JVM调优是一个复杂而持续的过程,涉及到内存管理、垃圾回收优化、线程同步等多个方面。通过合理使用jps、jmap、jstack以及JMX等工具,开发者可以更好地监控和调整JVM性能,确保Java应用程序能够高效稳定地运行。在...
博文链接提供的资源可能包含作者对JVM调优的深入理解和实践经验,包括但不限于垃圾收集器的选择与配置,内存参数的调整,线程管理,类加载机制,以及如何利用工具进行性能监控等。 1. **内存模型与调优** - **堆...
### JVM工具、参数调优与调试技巧 #### 一、JVM工具 ##### 1. jps:虚拟机进程状况工具 - **简介**:`jps` 是一个用于显示当前运行的所有Java虚拟机进程(JVMs)的简单工具。它会列出每个JVM的PID(进程ID)以及...
通过修改Connector配置来设定最大线程数(maxThreads)、最小空闲线程数(minSpareThreads)、线程预启动数量(prestartminSpareThreads)以及最大请求等待队列(maxQueueSize)。其中,maxThreads一般建议设置在500至1000...