解决 - java.lang.OutOfMemoryError: unable to create new native thread

以前常遇到此问题,一般想法就是修改配置启动参数,想方设法增大参数,认为这样可以避免内存溢出。但效果基本上还是会出错。我在网上找到了一篇文章解决此问题 点击打开链接 主要观点为

这个异常问题本质原因是我们创建了太多的线程,而能创建的线程数是有限制的,导致了异常的发生。能创建的线程数的具体计算公式如下:
(MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = Number of threads
MaxProcessMemory 指的是一个进程的最大内存
JVMMemory         JVM内存
ReservedOsMemory  保留的操作系统内存
ThreadStackSize      线程栈的大小

在java语言里, 当你创建一个线程的时候,虚拟机会在JVM内存创建一个Thread对象同时创建一个操作系统线程,而这个系统线程的内存用的不是JVMMemory,而是系统中剩下
的内存(MaxProcessMemory - JVMMemory - ReservedOsMemory)。 
由公式得出结论:你给JVM内存越多,那么你能创建的线程越少,越容易发生java.lang.OutOfMemoryError: unable to create new native thread。 
解决问题:
1, 如果程序中有bug,导致创建大量不需要的线程或者线程没有及时回收,那么必须解决这个bug,修改参数是不能解决问题的。
2, 如果程序确实需要大量的线程,现有的设置不能达到要求,那么可以通过修改MaxProcessMemory,JVMMemory,ThreadStackSize这三个因素,来增加能创建的线程数:
a, MaxProcessMemory 使用64位操作系统
b, JVMMemory   减少JVMMemory的分配
c, ThreadStackSize  减小单个线程的栈大小

这个观点让我开始也很不解,但仔细查看了一下出错日志

# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (malloc) failed to allocate 2334888 bytes for Chunk::new
# An error report file with more information is saved as:
# D:\xxx_err_pid1904.log

在查看详细的pid日志,则惊喜的发现其给出的解决方法与上面讲到的理论相同

#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (malloc) failed to allocate 2355528 bytes for Chunk::new
# Possible reasons:
#   The system is out of physical RAM or swap space
#   In 32 bit mode, the process size limit was hit
# Possible solutions:
#   Reduce memory load on the system
#   Increase physical memory or swap space
#   Check if swap backing store is full
#   Use 64 bit Java on a 64 bit OS
#   <span style="color:#FF0000;">Decrease Java heap size (-Xmx/-Xms)</span>
#   <span style="color:#FF0000;">Decrease number of Java threads</span>
#   <span style="color:#FF0000;">Decrease Java thread stack sizes (-Xss)</span>
#   Set larger code cache with -XX:ReservedCodeCacheSize=
# This output file may be truncated or incomplete.
#
#  Out of Memory Error (allocation.cpp:328), pid=4308, tid=6720
#
# JRE version: 7.0_25-b16
# Java VM: Java HotSpot(TM) Server VM (23.25-b01 mixed mode windows-x86 )
# Failed to write core dump. Call to MiniDumpWriteDump() failed
#

注意上面标红色处

于是将tomcat服务启动参数都改小了一半,变为如下参数

-Xms256M
-Xmx512M
-Xss1M

再启动服务,并立即观察任务管理中tomcat进程详细,内存使用情况较出错时内存使用上涨的最大值小了,并逐渐回落到一个比较低的值。而CPU的使用情况在刚启动时比出错时值要高一点,启动后回归正常。并且服务可以正常启动了。

综合上面的情况,并在简单的实践后,我认为引用文章中的理论应该是有道理的,所以下次再遇到此异常,不妨试试将有关配置参数降低,没准会解决问题。

时间: 2024-10-08 17:08:08

解决 - java.lang.OutOfMemoryError: unable to create new native thread的相关文章

Hive java.lang.OutOfMemoryError: unable to create new native thread异常

最近在同一时刻执行多个hive -e 操作时,出现了java.lang.OutOfMemoryError: unable to create new native thread异常 或Exception in thread "main" java.lang.RuntimeException: java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.metastore.HiveMetaStoreCl

关于“java.lang.OutOfMemoryError : unable to create new native Thread”的报错问题

转自:https://www.cnblogs.com/flying-tiger/p/5956926.html java.lang.OutOfMemoryError : unable to create new native Thread. 具体截图如下: 在查看日志文件的时候,也有以下出错信息: Error occurred during initialization of VM... 经过百度,找到方法: 既然报"OutOfMemoryError",而且还是" unable

HBASE遇到的java.lang.OutOfMemoryError: unable to create new native thread解决方法

简单分享一下,类似问题的解决方法 刚才在某机器上上xxx用户下压测时遇到这个问题,连xxx都进不去了 说明xxx用户下无法创建跟多的线程了(当然root用户没这个问题) 系统能够创建的最大线程数:(MaxProcessMemory - JVMMemory – 系统内存) / (ThreadStackSize) = Number of threads 有两种方式: 减少xxx下的ThreadStackSize 增加xxx下的nproc数量 修改 [[email protected]]$ ulimi

经常遇到的java.lang.OutOfMemoryError: unable to create new native thread解决方法

简单分享一下,类似问题的解决方法 刚才在某机器上上xxx用户下压测时遇到这个问题,连xxx都进不去了 说明xxx用户下无法创建跟多的线程了(当然root用户没这个问题) 系统能够创建的最大线程数:(MaxProcessMemory - JVMMemory – 系统内存) / (ThreadStackSize) = Number of threads 有两种方式: 减少xxx下的ThreadStackSize 增加xxx下的nproc数量 修改 [[email protected]]$ ulimi

再谈 Unlix (Linux, AIX, HPUX) 上 Java 的 java.lang.OutOfMemoryError: unable to create new native thread

首先很容易排除是 程序问题 内存用了很少,64 位 Java也没有内存限制,线程也不多,-Xss 堆栈也没人会配置很大. 那么肯定是 limit 不足引起 配置 ulimit 就可以了,问题看起来很简单,但是问题为什么有时候难以解决,因为涉及 Uinux 下面因素 到底那一个 limit 控制 到底 soft 还是 hard 设置在 /etc/security/limits.conf, 还是用户 Profile 如果是 crontab 启动又如何配置 澄清概念 Java 线程数多少是受 max

java.lang.OutOfMemoryError: unable to create new native thread

tomcat的web项目压力测试时,测试了几秒钟,web服务开始无响应.tomcat的日志中看到如下错误: 查了以下该process开启的线程数为3366 $ pstree -p 22750 | wc -l 3366 而此时内存消耗量并不大,然后又用 ulimit -a查看了各个限制,发现 max user processes 才4096. 然后修改 /etc/security/limits.conf ,下方添加以下内容(webadmin是启动tomcat的用户): root - nofile

JVM虚拟机宕机_java.lang.OutOfMemoryError: unable to create new native thread

原因:当前用户的系统最最大程序数数已达到最大值,使用ulimit -u可以看到是1024   解决办法:在当前用户下使用ulimit -u 65535 然后再执行jsp,一切ok 功能说明:控制shell程序的资源.语 法:ulimit [-aHS][-c <core文件上限>][-d <数据节区大小>][-f <文件大 小>][-m <内存大小>][-n <文件数目>][-p <缓冲区大小>][-s <堆叠大 小>][-

Spark - ERROR Executor: Exception in tjava.lang.OutOfMemoryError: unable to create new native thread

如果你的Spark程序在执行过程中报出如下类似的错误: ERROR Executor: Exception in task xxx in stage xxx java.lang.OutOfMemoryError: unable to create new native thread 那么可能性非常大的原因是你当前通过spark-submit或spark-sql启动的程序中开启了过多的进程,以至超过了操作系统对当前用户所允许打开的进程数的上限.确定这个问题的方法是这样的: 首先,通过命令: uli

解决 - java.lang.OutOfMemoryError: unable to create new native thread (转载)

一.认识问题: 首先我们通过下面这个 测试程序 来认识这个问题: 运行的环境 (有必要说明一下,不同环境会有不同的结果):32位 Windows XP,Sun JDK 1.6.0_18, eclipse 3.4, 测试程序: Java代码 import java.util.concurrent.CountDownLatch; public class TestNativeOutOfMemoryError { public static void main(String[] args) { for