一、问题:

  春节将至,系统访问量进入高峰期。随之系统出现了异常: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的更多相关文章

  1. JVM内存越多,能创建的线程越少,越容易发生java.lang.OutOfMemoryError: unable to create new native thread。

    一.认识问题: 首先我们通过下面这个 测试程序 来认识这个问题:运行的环境 (有必要说明一下,不同环境会有不同的结果):32位 Windows XP,Sun JDK 1.6.0_18, eclipse ...

  2. [java] [error] java.lang.OutOfMemoryError: unable to create new native thread

    前言 最近公司的服务器出现了oom的报错,经过一番排查,终于找到了原因.写下这篇博客是为了记录下查找的过程,也是为了帮助那些跟我门遇到的情况相同的人可以更快的寻找到答案. 环境 系统:linux(ce ...

  3. java.lang.OutOfMemoryError: unable to create new native thread如何解决

    工作中碰到过这个问题好几次了,觉得有必要总结一下,所以有了这篇文章,这篇文章分为三个部分:认识问题.分析问题.解决问题. 一.认识问题: 首先我们通过下面这个 测试程序 来认识这个问题:运行的环境 ( ...

  4. 剥下“java.lang.OutOfMemoryError: unable to create new native thread”的外衣 创建线程数公式(MaxProcessMemory - JVMMemory – ReservedOsMemory)

    剥下“java.lang.OutOfMemoryError: unable to create new native thread”的外衣 星期一早上到了公司,据称产品环境抛出了最可爱的异常—OutO ...

  5. 解决java.lang.OutOfMemoryError: unable to create new native thread问题

    解决:1.升级JVM到最新的版本 最新版本的JVM一般在内存优化方面做的更好,升级JVM到最新的版本可能会缓解测问题2.从操作系统层面去解决 使用64位操作系统 如果使用32位操作系统遇到unable ...

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

    最近迁移集群,在hadoop-2.8.4 的yarn上跑 spark 程序 报了以下错误 java.lang.OutOfMemoryError: unable to create new native ...

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

    好吧 我发誓这是postgresql的Mirroring Controller的RT测试的最后一个坑了. 在这个RT测试的最后,要求测试Mirroring Controller功能在长时间运行下的稳定 ...

  8. spark大批量读取Hbase时出现java.lang.OutOfMemoryError: unable to create new native thread

    这个问题我去网上搜索了一下,发现了很多的解决方案都是增加的nproc数量,即用户最大线程数的数量,但我修改了并没有解决问题,最终是通过修改hadoop集群的最大线程数解决问题的. 并且网络上的回答多数 ...

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

    首先很容易排除是 程序问题 内存用了很少,64 位 Java也没有内存限制,线程也不多,-Xss 堆栈也没人会配置很大. 那么肯定是 limit 不足引起 配置 ulimit 就可以了,问题看起来很简 ...

随机推荐

  1. 统计不同的单词(map应用)

    题目描述: 输入一些单词,找出所有满足如下条件的单词:该单词不能通过字母重排,得到输入文本中的另一个单词.在判断是否满足条件时,字母不区分大小写,但在输出时应保留输入中的大小写,按字典序进行排列(所有 ...

  2. BackgroundWorker 控件

    BackgroundWorker是.net里用来执行多线程任务的控件,它允许编程者在一个单独的线程上执行一些操作.耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面 (UI) 始终处于停 ...

  3. IOS的设计模式

    对象创建 原型(Prototype) 使用原型实例指定创建对象的种类,并通过复制这个原型创建新的对象. NSArray *array = [[NSArray alloc] initWithObject ...

  4. Spring整合JUnit4测试时,使用注解引入多个配置文件

    转自:https://blog.csdn.net/pwh309315228/article/details/62226372 一般情况下: @ContextConfiguration(Location ...

  5. 关于android的一些博文收集

    Java网络编程总结 http://www.cnblogs.com/oubo/archive/2012/01/16/2394641.html Android应用系列:双击返回键退出程序 http:// ...

  6. [HDU1754]I Hate It线段树裸题

    http://acm.hdu.edu.cn/showproblem.php?pid=1754 解题关键:刚开始死活超时,最后发现竟然是ch,和t1.t2每次循环都定义的锅,以后养成建全局变量的习惯. ...

  7. 对vuex的理解

    我用的vue安装了一个插件vuex插件 有3个 文件夹分别是actions(用于数据请求),getters(用于监听store),store(用于存储数据),

  8. DBVisualizer Pro for mac

    公司使用的是DB2数据库,支持DB2的数据库客户端常用的有DBeaver和DBVisualizer.DBeaver是免费的,但本人电脑安装后,启动一直报错,问题一直没解决就放弃了.改用DBVisual ...

  9. synchronized关键字的作用域

    转自:http://www.cnblogs.com/devinzhang/archive/2011/12/14/2287675.html 1.synchronized关键字的作用域有二种: 1)是某个 ...

  10. 【C#】VS2017 winform 打包

    首先要在想要打包的项目下创建一个新的项目, 创建好setup项目,之后点击属性,去修改打包软件的名字,ProductName....可以选填 到此已经创建好了setup工程了,那么下面开始将要打包的d ...