记一次内存溢出java.lang.OutOfMemoryError: unable to create new native thread
一、问题:
春节将至,系统访问量进入高峰期。随之系统出现了异常:java.lang.OutOfMemoryError: unable to create new native thread。在解决这个问题中,尝试了各种方法,最后竟然是因为它......
二、解决办法:
1、 关于这个问题,一开始猜想是因消息队列(activemq)引起的,因为处理数据较多,开启的线程数较多导致,因此对MQ搭建了集群。
MQ集群搭建方法:http://blog.csdn.net/jiangxuchen/article/details/8004561
但是搭建集群后发现,并没有什么卵用,问题依旧。
继续......
2、 接下来怀疑是系统里开的线程数太多,在优化后,问题仍然存在。
继续......
3、 内存调优,减小xss值、JVM内存,仍然解决不了。
继续......
4、 几番周测,在整理思路后,决定首要任务就是如何重现该问题,于是编写测试程序,测试出操作系统最大能够创建的线程数:
import java.util.concurrent.CountDownLatch; public class TestNativeOutOfMemoryError { public static void main(String[] args) { for (int i = 0;; i++) {
System.out.println("i = " + i);
new Thread(new HoldThread()).start();
}
} } class HoldThread extends Thread {
CountDownLatch cdl = new CountDownLatch(1); public HoldThread() {
this.setDaemon(true);
} public void run() {
try {
cdl.await();
} catch (InterruptedException e) {
}
}
}
运行后:
i = 982
Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread
at java.lang.Thread.start0(Native Method)
at java.lang.Thread.start(Thread.java:597)
at TestNativeOutOfMemoryError.main(TestNativeOutOfMemoryError.java:20)
问题重现,在反复运行几次后发现,生产系统最大只能创建980多个线程,生产系统操作系统64位centeros,jdk1.7,64G内存。而我本地PC电脑都可以创建2500左右。
感觉原因快找到了,切换到运行账户使用命令:
$ su Bst118
$ ulimit -u
$ 1024
生产上所有程序都是在Bst118账户下运行,于是查看该账户下所有的线程数总和为950,也即是说,随时都可能会超过1024,导致内存溢出。查看看进程当前运行的线程数命令为:pstree -p 3660 | wc -l
原因找到,操作系统对运行程序的账户有最大线程数限制。
$ vim /etc/security/limits.d/90-nproc.conf
aaarticlea/png;base64,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" alt="" />
打开后发现除了root,其他账户都限制在1024个。
于是增加一条:Bst118 soft nproc 20000
为什么设置为20000,因为测试后发现,在运行到35000左右,系统就报内存溢出了,操作系统所有命令都不能使用,因此将程序最大线程数限制在20000。
修改后再没出现内存溢出错误。问题解决。
三、思考
1、经过总结,在遇到问题后,不能盲目的到处修改,首先要做的就是重现问题,顺藤摸瓜,逐步的找出根本原因。
2、关于tomcat内存调优,个人认为只有在中大型系统才需要调优或者服务器硬件条件一般的情况下才需要调优,才能有所效果。
记一次内存溢出java.lang.OutOfMemoryError: unable to create new native thread的更多相关文章
- JVM内存越多,能创建的线程越少,越容易发生java.lang.OutOfMemoryError: unable to create new native thread。
一.认识问题: 首先我们通过下面这个 测试程序 来认识这个问题:运行的环境 (有必要说明一下,不同环境会有不同的结果):32位 Windows XP,Sun JDK 1.6.0_18, eclipse ...
- [java] [error] java.lang.OutOfMemoryError: unable to create new native thread
前言 最近公司的服务器出现了oom的报错,经过一番排查,终于找到了原因.写下这篇博客是为了记录下查找的过程,也是为了帮助那些跟我门遇到的情况相同的人可以更快的寻找到答案. 环境 系统:linux(ce ...
- java.lang.OutOfMemoryError: unable to create new native thread如何解决
工作中碰到过这个问题好几次了,觉得有必要总结一下,所以有了这篇文章,这篇文章分为三个部分:认识问题.分析问题.解决问题. 一.认识问题: 首先我们通过下面这个 测试程序 来认识这个问题:运行的环境 ( ...
- 剥下“java.lang.OutOfMemoryError: unable to create new native thread”的外衣 创建线程数公式(MaxProcessMemory - JVMMemory – ReservedOsMemory)
剥下“java.lang.OutOfMemoryError: unable to create new native thread”的外衣 星期一早上到了公司,据称产品环境抛出了最可爱的异常—OutO ...
- 解决java.lang.OutOfMemoryError: unable to create new native thread问题
解决:1.升级JVM到最新的版本 最新版本的JVM一般在内存优化方面做的更好,升级JVM到最新的版本可能会缓解测问题2.从操作系统层面去解决 使用64位操作系统 如果使用32位操作系统遇到unable ...
- spark java.lang.OutOfMemoryError: unable to create new native thread
最近迁移集群,在hadoop-2.8.4 的yarn上跑 spark 程序 报了以下错误 java.lang.OutOfMemoryError: unable to create new native ...
- 关于“java.lang.OutOfMemoryError : unable to create new native Thread”的报错问题
好吧 我发誓这是postgresql的Mirroring Controller的RT测试的最后一个坑了. 在这个RT测试的最后,要求测试Mirroring Controller功能在长时间运行下的稳定 ...
- spark大批量读取Hbase时出现java.lang.OutOfMemoryError: unable to create new native thread
这个问题我去网上搜索了一下,发现了很多的解决方案都是增加的nproc数量,即用户最大线程数的数量,但我修改了并没有解决问题,最终是通过修改hadoop集群的最大线程数解决问题的. 并且网络上的回答多数 ...
- 再谈 Unlix (Linux, AIX, HPUX) 上 Java 的 java.lang.OutOfMemoryError: unable to create new native thread
首先很容易排除是 程序问题 内存用了很少,64 位 Java也没有内存限制,线程也不多,-Xss 堆栈也没人会配置很大. 那么肯定是 limit 不足引起 配置 ulimit 就可以了,问题看起来很简 ...
随机推荐
- mysql基础之三:char与varchar区别,varchar(M)能存多少
char与varchar区别 char (13)长度固定, 如'1234567890' 存储需要空间 10个字符; varchar(13) 可变长 如'1234567890' 需要存储空间 11字符; ...
- JVM体系结构之六:堆Heap之2:新生代及新生代里的两个Survivor区(下一轮S0与S1交换角色,如此循环往复)、常见调优参数
一.为什么会有年轻代 我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能.你先想想,如果没有分代,那我们所有的对象都在一块,GC的时候我 ...
- oracle--事物---
一.什么是事务 事务用于保证数据的一致性,它由一组相关的dml语句组成,该组的dml(数据操作语言,增删改,没有查询)语句要么全部成功,要么全部失败. 如:网上转账就是典型的要用事务来处理,用于保证数 ...
- for循环及break和continue的区别
1.For循环 格式: for( 初始语句 ; 执行条件 ; 增量 ){ 循环体 } 执行顺序:1.初始语句 2.执行条件是否符合 3.循环体 4.增加增量 初始化语句只在循环开始前执行一次,每次 ...
- C#中打开文件、目录、保存窗口
打开文件代码: try { OpenFileDialog of = new OpenFileDialog(); of.ShowDialog(); txt_destFilePath.Text = of. ...
- elasticsearch2.x插件之一:kibana
介绍: 要说kibana,就不得不先说一下logstash.这里呢,先要讲个故事.故事是开头是这样的,Logstash早期曾经自带了一个特别简单的logstash-web用来查看ES中的数据,其功能太 ...
- invalid loc header的解决办法
eclipse 运行程序,报invalid loc header,网上一查,删除maven仓库(默认位于%USERPROFILE%\.m2\repository\org)中的下载包,然后重新下载.
- .NET Core 3.0 可回收程序集加载上下文
一.前世今生 .NET诞生以来,程序集的动态加载和卸载都是一个Hack的技术,之前的NetFx都是使用AppDomain的方式去加载程序集,然而AppDomain并没有提供直接卸载一个程序集的API, ...
- “FreeTextBox”控件使用——Word编辑器
前言 在敲牛腩新闻发布系统时,添加新闻修改新闻的时候遇到了Word编辑器控件.它是引用了第三方控件,下面关于怎么引用该控件及其一些简单的使用方法进行分析. 内容 在网上找的该插件"FreeT ...
- 洛谷P3649 [APIO2014]回文串(回文自动机)
传送门 话说回文自动机我自己都还没搞懂呢…… 等到时候会了再来填坑 //minamoto #include<cstdio> #include<cstring> #define ...