java.lang.OutOfMemoryError: unable to create new native thread问题诊断

转载自:http://www.blogjava.net/ldd600/archive/2009/09/25/296397.html

 

搜罗了一下在网上找到了一个计算公式:

(MaxProcessMemory - JVMMemory – ReservedOsMemory) / (ThreadStackSize) = Number of threads 

MaxProcessMemory:进程最大的寻址空间,但我想这个值应该也不会超过虚拟内存和物理内存的总和吧。关于不同系统的进程可寻址的最大空间,可参考下面表格:

 

Maximum Address Space Per Process

Operating System

Maximum Address Space Per Process

Redhat Linux 32 bit

2 GB

Redhat Linux 64 bit

3 GB

Windows 98/2000/NT/Me/XP

2 GB

Solaris x86 (32 bit)

4 GB

Solaris 32 bit

4 GB

Solaris 64 bit

Terabytes

 

JVMMemory: Heap + PermGen

ReservedOSMemory:Native heap,JNI

便可推导出单个JVM Instance可支持的最大线程数的估计值:

(MaxProcessMemory<固定值> – Xms<初始化值,最小值> – XX:PermSize<初始化值,最小值> – 100m<估算值>) / Xss = Number of threads<最大值>

在本地(32bit windows)试了试,可达的线程的最大值差不多就是这个数,它不受物理内存的限制,会利用虚拟内存,从任务管理器看到memory已经是5500 m左右了(开了两个jvm),我机器的物理内存是2g,也不知道这个准不准,后来还抛出了“unable to create new native thread”的兄弟“Exception in thread "CompilerThread0" java.lang.OutOfMemoryError: requested 471336 bytes for Chunk::new. Out of swap space?“。

本地测完了后,就该轮到dev环境了,linux2.6,64bit,双核,8G(虚拟机),总的物理内存是16g。在上面整了一下,创建到了15000多个线程的时候挂掉了。此时其他application也不能创建新的线程,而且db也报错了,操作系统不能fork新的线程了。这应该是操作系统的哪里限制了新线程的创建,

·         max thread,linux2.6似乎是32000

·         最大可用内存:物理内存+虚拟内存

·         配置,在linux可以限制可用资源的大小,show一下这些参数

 

core file size          (blocks, -c) 0

data seg size           (kbytes, -d) unlimited

file size               (blocks, -f) unlimited

pending signals                 (-i) 1024

max locked memory       (kbytes, -l) 32

max memory size         (kbytes, -m) unlimited

open files                      (-n) 65536

pipe size            (512 bytes, -p) 8

POSIX message queues     (bytes, -q) 819200

stack size              (kbytes, -s) 10240

cpu time               (seconds, -t) unlimited

max user processes              (-u) 16384

virtual memory          (kbytes, -v) unlimited

file locks                      (-x) unlimited

 

为了进一步确定在linux上一个jvm因为达到了最大寻址空间OOM了,不会影响其他jvm,我在Linux做了进一步测试,一开始用Sun文档中说的最大寻址空间3G试了一下,发现根本不对,达到了3G后还是非常high地在创建新的线程。于是出动超级无敌变态的JVM初始化配置。

 

oracle   27408 27017 12 13:45 ?        00:00:07 /home/oracle/ias1013/FWAPP/FWDev/jdk/bin/java -server -Xmx4096m -Xms4096m -XX:+HeapDumpOnOutOfMemoryError -XX:PermSize=4096m -XX:MaxPermSize=4096m -XX:HeapDumpPath=/home/oracle/ias1013/FWAPP/FWDev/j2ee/OC4J_OOMTest/workEnv/log -Xss100m

 

结果在create 3379个线程后,“unable to create new native thread”出现了,这时其他jvm都是可以create新线程的。如果按照上面公式计算,linux 64bit,2.6kernel,它的最大寻址空间肯定超过了300g,当然应该还没有达到可用内存的限制,因为其他JVM还能create新线程。

我还怀疑是不是oracle application server上的某个配置参数限制了总的线程数,影响了所有application,但我们的产品环境一个application就是一个单独的application server。

现在基本上可以确定是操作系统哪里设置错了,我想System team的帅哥们应该把产品环境的某个参数配置错了,系统本身的影响肯定不会有了,因为产品环境上我们只create了800左右个线程,就OOM了,那应该就是配置的问题了,怀疑的参数有下面四个

max user processes              (-u) 2048

virtual memory          (kbytes, -v) unlimited

max memory size         (kbytes, -m) unlimited

stack size              (kbytes, -s) 10240

最后发现只有max user processes 和virtual memory对总的线程数有影响,我把max user processes降到2048后,发现此时只能创建 2000左右个线程了(Xms64m, Xss1m),进一步地把virtual memory下调到2048000K发现能创建的就更少了1679(Xms64m, Xss1m),而它只会对当前shell起作用,而多个application server应该是不同的shell,所以他是打酱油的。另外两个参数好像就是来做做俯卧撑的,操作系统stack size是不应该会有什么影响,我们把它上调到102400,还是可以创建2000左右的线程数(max user processes),因为java有自己的线程模型,它的栈的大小是用Xss来控制的。Max memory size不知道是啥东东,照理说如果是最大内存应该不会只在旁边做俯卧撑,那这个参数到底是春哥还是曾哥,查了一下man ulimit,有下面解释

              -a     All current limits are reported

              -c     The maximum size of core files created

              -d     The maximum size of a process data segment

              -f     The maximum size of files created by the shell

              -l     The maximum size that may be locked into memory

              -m     The maximum resident set size (has no effect on Linux)

              -n     The maximum number of open file descriptors (most systems do not allow this value to be set)

              -p     The pipe size in 512-byte blocks (this may not be set)

              -s     The maximum stack size

              -t     The maximum amount of cpu time in seconds

              -u     The maximum number of processes available to a single user

              -v     The maximum amount of virtual memory available to the shell

“Has no effect on Linux”就足以证明它确实只是来做做俯卧撑的。最后查出只有“max user processes”会对所有application能创建总的线程数有限制。

 

Java EE工程师实战能力地图:环境配置、JVM调优与云原生落地 Java EE是企业级Java应用开发的核心技术体系,其本质是规范、运行时与工程实践的深度协同。理解JDK版本演进与字节码兼容性,是规避'不支持发行版本'等编译错误的前提;掌握JVM内存模型与GC机制,则能精准诊断OutOfMemoryError七类场景并实施G1调优;而Servlet容器选型、HikariCP连接池配置及Jakarta EE 9+迁移,直接决定系统在云原生环境中的稳定性与扩展性。本文聚焦真实工程现场高频痛点,融合java环境变量配置、java: outofmemoryerror等典型问题, 阅读详情

相关推荐

Java内存溢出(OOM)错误解析与优化实战

内存管理是Java性能优化的核心议题,其中OutOfMemoryError(OOM)是最严重的内存问题之一。JVM内存分为堆、Metaspace、直接内存等多个区域,当任何区域耗尽时都会触发特定类型的OOM错误。通过GC日志分析和堆转储诊断,可以识别内存泄漏、缓存失控等典型问题模式。合理的JVM参数配置(如-Xmx、MaxMetaspaceSize)配合对象池化、分页处理等技术手段,能有效预防OOM发生。在高并发系统和大数据处理场景中,结合G1GC算法和内存监控组件,可以实现稳定的内存性能表现。

weixin_30566111的博客 470

mvn命令报错:java.lang.OutOfMemoryError: unable to create new native thread的原因排查

1. 序言 最近,在使用mvn test命令跑单员测试时,遇到了java.lang.OutOfMemoryError: unable to create new native thread错误 unable to create new thread类型的OOM错误,一般都发生在应用程序无法创建新线程时候 其出现的原因主要分为两种: 系统内存耗尽,无法为新线程分配内存 创建线程数超过了操作系统的限制(linux中可以通过ulimit -a查看系统的最大线程数) 这篇博客讲了很多排查上述错误的方法和实例

lucyLee的博客 6566

Java堆与栈深度解析:从OOM到StackOverflow的实战定位指南

堆与栈是JVM内存管理的两大核心区域,分别承担对象实例存储与方法调用生命周期管理。其本质差异在于共享性与独占性、GC回收与自动释放、对象实体与引用变量的物理分离。理解这一底层原理,是诊断java.lang.OutOfMemoryError和java.lang.StackOverflowError的关键前提。技术价值体现在性能调优、故障归因与资源合理分配——例如堆溢出多源于对象泄漏或大对象晋升,而栈溢出则指向递归失控或线程栈配置失当。典型应用场景覆盖电商大促压测、微服务内存治理、IoT端Java Agent开

weixin_30765577的博客 352

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

好吧 我发誓这是postgresql的Mirroring Controller的RT测试的最后一个坑了。在这个RT测试的最后,要求测试Mirroring Controller功能在长时间运行下的稳定性和性能问题,使用postgresql的JDBC接口不断的向数据库中写数据和读数据。在运行时,抛出了错误:java.lang.OutOfMemoryError : unable to create ne...

weixin_35316606的博客 309

Java堆与栈实战陷阱:OOM、栈溢出与JVM调优真相

堆和栈是Java内存模型的两大基石,前者管理对象生命周期并依赖GC回收,后者承载方法调用与局部变量,由CPU硬件直接调度。理解二者分工——引用存栈、对象在堆——是规避内存泄漏、StackOverflowError和虚假OOM的前提。技术价值在于精准定位性能瓶颈:堆问题常表现为GC频繁或内存缓慢增长,栈问题则体现为线程崩溃、递归失效或IDE调试异常;而元空间、直接内存等‘第三区域’更易被忽视。典型应用场景包括Spring Boot启动失败、日志框架导致的char[]爆炸、ThreadLocal引发的隐式内存泄

weixin_30421809的博客 417

告别卡顿:性能优化老手教你用MAT分析Java应用内存瓶颈(含实战案例)

本文详细介绍了如何使用MAT(Memory Analyzer Tool)分析Java应用内存瓶颈,包含堆转储文件获取、MAT核心视图解读及实战案例。通过电商后台服务卡顿问题的解决过程,展示了如何精准定位内存泄漏、优化缓存策略及连接池管理,帮助开发者高效解决内存问题。

ailiao2015的博客 388

多线程系列:一、进程与线程、Java中的线程池

四种类型的线程池 Executors.newFixedThreadPool(int nThreads): public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads, ...

BigBug_500的博客 1484

Java编码规范与性能优化实战指南

Java作为主流的面向对象编程语言,其编码规范直接影响程序的性能、可维护性和安全性。从JVM内存管理到多线程并发控制,良好的编码习惯能显著提升系统稳定性。本文重点解析字符串处理、集合框架、异常处理等核心场景中的性能陷阱,例如StringBuilder比直接拼接效率高200倍,基本类型比包装类快5倍等关键数据。通过剖析自动装箱、集合初始化容量、try-with-resources等典型case,帮助开发者规避内存泄漏、并发修改异常等常见问题。这些规范在电商秒杀、金融交易等高并发场景中尤为重要,是构建高性能Ja

weixin_33861800的博客 361

架构师技能3-彻底深入理解和分析Java中内存溢出OutOfMemoryError

java开发人员经常遇到OutOfMemoryError的问题。要解决这些问题,要有对java虚拟机的内存管理有一定的认识,甚至对linux系统也要有一定的熟悉。昨天遇到了OutOfMemoryError:unable to create new native thread问题,再次把之前的草稿文章整理,顺便总结发出来。 如果对jvm虚拟机还不了解,请先看我之前的总结: 《java(5)-深入理解虚拟机JVM》和《java(9)-深入浅出GC垃圾回收机制》 第一种OutOfMemoryError:

黄规速博客:学如逆水行舟,不进则退 2757

别再用图片水印了!5种你可能不知道的文本隐写术实战

本文介绍了5种高效的文本隐写术,帮助创作者在不影响内容可读性的情况下嵌入版权信息。从零宽度字符到同形字替换,再到标点符号变形和行尾空格编码,这些技术为数字内容提供了轻量级版权保护方案,特别适用于社交媒体和电子合同等场景。

k8l9m0n的博客 225

Ubuntu+Dify实战:如何让大模型知识库完美支持图片召回(附避坑指南)

本文详细介绍了在Ubuntu系统上部署Dify平台,并实现大模型知识库图片召回功能的完整实战方案。通过解析Dify处理图片的底层逻辑,重点讲解了配置Nginx代理服务器将本地图片路径转换为可公开访问URL的核心工程步骤,并提供了文档预处理、环境变量配置以及父子分段策略等高级技巧,帮助开发者构建图文并茂的AI应用,有效提升知识库的丰富性和用户体验。

c7d8e的博客 445

(MaxProcessMemory – JVMMemory – ReservedOsMemory) / (ThreadStackSize) = Number o

(MaxProcessMemory – JVMMemory – ReservedOsMemory) / (ThreadStackSize) = Number of threads    转自:http://www.chinasb.org/archives/2011/12/4138.shtml

fanday的专栏 721

变压器励磁电感、励磁电流、漏感、漏感折算

励磁、漏感知识整理

HW-BASE的博客 1万+

5. Unable to create new native thread

5.1 Unable to create new native thread Java应用一般是多线程的. 这意味着在用Java写的程序(似乎)可以在同时做多件事情. 例如 – 即使机器只有一个处理器 – 当你把内容从一个窗口拖动到另一个, 在后台播放的电影不会停止因为您一次执行了几个操作. 思考线程的一种方法是将它们视为可供提交任务的工作人员. 如果你只有一名员工, 他/她只能同时做一个任务...

east4ming的博客 8923

【Unity 实用工具篇】✨| I2 Localization 实现本地化及多种语言切换,快速上手

Unity的多语言本地化是一个很实用的功能,它可以帮助游戏支持多种语言,让不同语言的玩家都能够更好地体验游戏。 而实现本地化的方案也有很多种,各个方案之间也各有优劣,后面也会对多个方案进行介绍学习。 本文就来介绍一个专门作用于多语言本地化的插件:I2 Localization 。

努力前行,总会成为自己心中的那道光 3万+

Python爬虫教程:抓取地方政府网站的公开文件与政策信息

Web爬虫是指一种自动化脚本,用于模拟人类浏览器访问网页、提取网页内容的数据抓取工具。发送请求到目标网页;获取网页内容;解析网页内容,提取所需数据;将数据保存或进一步处理。爬虫可以抓取各种形式的数据,如文本、图片、文件等。本教程将重点展示如何抓取地方政府网站上公开的政策文件、公告等信息。许多政府网站都会采取一定的反爬虫措施,防止大量数据被爬取。IP封锁:如果短时间内大量请求来自同一IP,可能会被封锁。验证码:一些网站会使用验证码来验证访问者是否为机器人。动态加载。

2201_76125261的博客 1981

JDK 1.8 生产环境中遇到 OutOfMemoryError: Unable to create new native thread 异常时的排查流程和解决方案

定位:通过jstack和系统工具确认线程泄漏点解决:调整系统限制 + 优化线程池 + 修复泄漏代码预防:监控线程数 + 限制资源 + 代码审查核心原则:控制线程生命周期,避免无限制创建!

weixin_37944816的博客 1252

华为OD机试真题 新系统【优化充电桩调度算法】

华为OD机试 新系统真题【优化充电桩调度算法】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【优化充电桩调度算法】

qq_45776114的博客 753

【复盘】记录一次JVM 异常问题 java.lang.OutOfMemoryError: unable to create new native thread

记录一次JVM 异常问题 java.lang.OutOfMemoryError: unable to create new native thread

芝兰生于深谷,不以无人而不芳 686

Win10 系统下VisualStudio2022 配置Open3D-0.18.0(C++)

Win10 系统下VisualStudio2022 配置Open3D-0.18.0

点云侠的博客 2655

apollo-减速带通行

主车在通过减速带时速度不超过3m/s

是菜鸟o的博客 388

Java线程泄漏诊断与防护最佳实践

线程管理是Java并发编程的核心概念,每个线程会消耗栈内存和CPU资源。当线程数量失控时,会导致JVM抛出OutOfMemoryError异常,使系统完全瘫痪。合理的线程池配置和监控方案能有效预防这类问题,特别是在高并发场景下尤为重要。本文通过分析线程泄漏的典型场景,提供了从基础监控到高级防护的完整解决方案,涵盖线程转储分析、异步任务管理等关键技术要点,帮助开发者构建稳定的Java应用。

axfcjwkbi259888707的博客 394

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

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

今天系统突然收到错误日志: [code="java"]Feb 12, 2012 1:28:40 AM org.apache.tomcat.util.net.JIoEndpoint processSocket SEVERE: Error allocating socket processor java.lang.OutOfMemoryError: unable to create new na...

Herry 313

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

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

工作中碰到过这个问题好几次了,觉得有必要总结一下,所以有了这篇文章,这篇文章分为三个部分:认识问题、分析问题、解决问题。   一、认识问题: 首先我们通过下面这个 测试程序 来认识这个问题:运行的环境 (有必要说明一下,不同环境会有不同的结果):32位 Windows XP,Sun JDK 1.6.0_18, eclipse 3.4, 测试程序: Java代码   ...

liushengbaba的专栏 266

阅读笔记——实战:OutOfMemoryError

two targets One:验证java虚拟机规范中描述的各个运行时区域存储的内容; Two:在工作中遇到OOM时能根据异常的信息快速判断是哪个区域的内存溢出,知道怎样的代码会导致这些区域内存溢出,以及如何处理。 -java堆溢出 java heap用来存放对象实例,不断的创建对象,并保证这些对象可达。在达到最大容量限制就会产生内存溢出。-Xmx, -Xms, -Xmn(Young)...

yanfei0331的博客 180

Java应用性能优化实战:JVM核心参数解析与内存问题排查指南

Java虚拟机(JVM)作为Java应用的核心运行环境,其内存管理与垃圾回收机制直接影响着应用的性能与稳定性。理解JVM内存模型与GC原理,是进行性能调优的基础。通过合理配置堆内存、元空间等关键参数,并选择合适的垃圾回收器,可以有效提升吞吐量、降低延迟。在工程实践中,面对内存溢出(OOM)、频繁Full GC等常见性能瓶颈,掌握JDK自带的jstack、jmap等诊断工具,能够快速定位问题根源,例如分析线程死锁或排查内存泄漏。本文聚焦于JVM调优的核心参数配置与实战排查技巧,为构建高可用的Java服务提供系

leonard61306500的专栏 317
上一篇: 优化nginx服务器内核TCP参数
下一篇: Java注解Annotation介绍和使用
cwfmaker
博客等级 码龄18年 6粉丝 179原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值