记一次内存溢出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 就可以了,问题看起来很简 ...
随机推荐
- B+树索引和哈希索引的明显区别是:
如果是等值查询,那么哈希索引明显有绝对优势,因为只需要经过一次算法即可找到相应的键值:当然了,这个前提是,键值都是唯一的.如果键值不是唯一的,就需要先找到该键所在位置,然后再根据链表往后扫描,直到找到 ...
- CentOS 7关闭firewalld启用iptables
在CentOS7中,有很多CentOS 6中的常用服务发生了变化. 其中iptables是其中比较大的一个.防火墙iptables被firewalld取代. 本文将介绍,如果采用systemctl关闭 ...
- 杂项-Log:NLog
ylbtech-杂项-Log:NLog NLog是一个基于.NET平台编写的类库,我们可以使用NLog在应用程序中添加极为完善的跟踪调试代码. NLog是一个简单灵活的.NET日志记录类库.通过使用N ...
- CentOS配置LDAP服务器
环境:centos 5.8 安装: 1.yum安装oepnldap.openldap-servers.openldap-clients.openldap-devel [root@hao-linux ~ ...
- sql 基础总结
- Android精品资源汇总,10个源码(持续更新)
最近一直在学习Android,在各大社区逛,总结下自己看到的一些不错的源码.希望可以给大家带来帮助. 1.Android精品源码:带动态效果的Button(按钮) 最喜欢各种效果的按钮了,没办法就是这 ...
- ls- 查看文件信息
通过ls 命令不仅可以查看linux文件夹包含的文件,而且可以查看文件权限(包括目录.文件夹.文件权限),查看目录信息等等,ls 命令在日常的linux操作中用的很多,在此给大家介绍一下ls 命令的使 ...
- [原创]SQL 表值函数:获取从今天计算起往前自定义天数
PS:此博文是利用Windows Live Writer 2012编写,格式效果可能不太好. 在我开发过程中,遇到一个统计需求,结果是要求返回从当天起往回推算出自定义输入的天数 为此我写了一个表值函数 ...
- Learning Python 004 基础的数据类型和变量
Python 基础的数据类型和变量 数据类型 整数 Python可以处理任意大小的整数,当然包括负整数. Python表示十六进制也用0x前缀. 浮点数 1.23x10^9和12.3x10^8是完全相 ...
- TCP三次握手四次挥手原理
转自http://www.cnblogs.com/liuxiaoming/archive/2013/04/27/3047803.html TCP协议三次握手原理: 首先,给张图片,建立TCP三次握手的 ...