[java] [error] java.lang.OutOfMemoryError: unable to create new native thread
前言
最近公司的服务器出现了oom的报错,经过一番排查,终于找到了原因。写下这篇博客是为了记录下查找的过程,也是为了帮助那些跟我门遇到的情况相同的人可以更快的寻找到答案。
环境
系统:linux(centos 7)
平台:java
介绍
程序结构介绍

上图为报错程序的结构图,从图中可以看出有一个主的JVM运行主要的java程序,当有请求到达时,对于每个请求都会启动一个JVM去处理请求。
报错介绍
当上面所述的程序接受到的请求超过一定数量时,就会报错 java.lang.OutOfMemoryError: unable to create new native thread
分析步骤
1.通过上面的报错信息可以得到以下结论:(ps:关于内存溢出这块的知识可以查看https://www.cnblogs.com/lin-xuan/p/5271354.html)
- 该报错是内存溢出导致的
- 内存溢出的地方在java虚拟机栈或者本地方法栈
2.通过进一步的百度我们找到了以下的解答:
- 系统内存耗尽,无法为新线程分配内存
- 创建线程数超过了操作系统的限制
3.通过 top 命令查看在程序运行时内存的使用情况,发现当报错时内存的使用为50%,因此排除了内存耗尽的情况
4.通过 ulimit -u 命令查看系统允许用户最大创建线程数,发现用户最大可以创建1024个线程

5.通过 ulimit -u 命令修改用户最大线程数,再次使用 ulimit -u 查看是否修改成功

6.当我们把用户最大线程数修改为4096时,我们发现可创建的JVM并没有增加多少,因此我们决定模拟环境,来排查具体的原因
7.创建文件SubJVM.java,并且输入以下内容:
import java.util.concurrent.TimeUnit;
public class SubJVM {
public static void main(String...args) throws InterruptedException{
TimeUnit.SECONDS.sleep(30);
}
}
8.创建文件MainJVM.java,并且输入以下内容:
public class MainJVM {
public static void main(String...args) {
for(int i = 0; i < 10000; i++) {
System.out.println("Thread num:" + i);
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
Process ps = Runtime.getRuntime().exec("java SubJVM");
} catch (Exception e) {
e.printStackTrace();
}
}
});
thread.start();
}
}
}
9.分别将 ulimit -u 设置为1024、4096、10000,然后会的到以下结果:
| ulimit -u | JVM数 |
| 1024 | 82 |
| 4096 | 298 |
| 10000 | 712 |
10.这时我们猜想每个JVM中会有若干个线程,统计如下:
1024/82=12
4096/298=13
10000/712=14
11.为了解释我们心中的猜想,我们使用了以下命令查看每个JVM的线程数(请自行百度查看该命令的使用方式):
jstack pid
12.该命令的输出内容如下:
2018-04-08 01:26:43
Full thread dump Java HotSpot(TM) 64-Bit Server VM (24.80-b11 mixed mode): "Attach Listener" daemon prio=10 tid=0x00007f90c0001000 nid=0x2f3c waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE "Service Thread" daemon prio=10 tid=0x00007f90f4097800 nid=0x2d85 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE "C2 CompilerThread1" daemon prio=10 tid=0x00007f90f4095800 nid=0x2d82 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE "C2 CompilerThread0" daemon prio=10 tid=0x00007f90f4092800 nid=0x2d80 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE "Signal Dispatcher" daemon prio=10 tid=0x00007f90f4090000 nid=0x2d6b runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE "Finalizer" daemon prio=10 tid=0x00007f90f406f000 nid=0x2d3b in Object.wait() [0x00007f90ed04e000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000000d7404858> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135)
- locked <0x00000000d7404858> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209) "Reference Handler" daemon prio=10 tid=0x00007f90f406d000 nid=0x2d37 in Object.wait() [0x00007f90f81b2000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000000d7404470> (a java.lang.ref.Reference$Lock)
at java.lang.Object.wait(Object.java:503)
at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:133)
- locked <0x00000000d7404470> (a java.lang.ref.Reference$Lock) "main" prio=10 tid=0x00007f90f4009000 nid=0x2cf0 waiting on condition [0x00007f90fd824000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at Sleep.main(Sleep.java:4) "VM Thread" prio=10 tid=0x00007f90f4068800 nid=0x2d28 runnable "GC task thread#0 (ParallelGC)" prio=10 tid=0x00007f90f401e800 nid=0x2cf1 runnable "GC task thread#1 (ParallelGC)" prio=10 tid=0x00007f90f4020800 nid=0x2d08 runnable "GC task thread#2 (ParallelGC)" prio=10 tid=0x00007f90f4022800 nid=0x2d13 runnable "GC task thread#3 (ParallelGC)" prio=10 tid=0x00007f90f4024800 nid=0x2d17 runnable "VM Periodic Task Thread" prio=10 tid=0x00007f90f40a2800 nid=0x2d9d waiting on condition JNI global references: 107
13.统计以上信息可知,一个JVM中大概有14个线程,这也解释了为什么增加了 ulimit -u 的值,JVM的数量还是没有达到预期的值。
解决
1.切换到root用户
2.输入以下命令
vim /etc/security/limits.d/20-nproc.conf
3.在文件中加入以下内容:
* soft nproc 4096
root soft nproc unlimited
[java] [error] java.lang.OutOfMemoryError: unable to create new native thread的更多相关文章
- 关于“java.lang.OutOfMemoryError : unable to create new native Thread”的报错问题
好吧 我发誓这是postgresql的Mirroring Controller的RT测试的最后一个坑了. 在这个RT测试的最后,要求测试Mirroring Controller功能在长时间运行下的稳定 ...
- 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 ...
- 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”的外衣 创建线程数公式(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 ...
- 记一次内存溢出java.lang.OutOfMemoryError: unable to create new native thread
一.问题: 春节将至,系统访问量进入高峰期.随之系统出现了异常:java.lang.OutOfMemoryError: unable to create new native thread.在解决这个 ...
- JVM虚拟机宕机_java.lang.OutOfMemoryError: unable to create new native thread
原因:当前用户的系统最最大程序数数已达到最大值,使用ulimit -u可以看到是1024 解决办法:在当前用户下使用ulimit -u 65535 然后再执行jsp,一切ok 功能说明:控 ...
- 线程ava.lang.OutOfMemoryError: unable to create new native thread
近日开发遇到多线程的问题: java.lang.OutOfMemoryError: unable to create new native thread Exception in thread &qu ...
随机推荐
- JDK+Tomcat+Eclipse环境搭建过程记录
这学期选了一门公选课叫网络开发工具与技术,主要学习用JSP语言构建网站.在配置环境的过程中遇到不少的坑,于是记录下来,希望能帮到大家. 系统环境:Win10 JDK版本:8u121, JAVA版本1. ...
- 类Vector
/* * Vector的特有功能 * * Vector出现较早,比集合更早出现 * * 1:添加功能 * public void addElement(Object obj);//用add()替代 * ...
- Session设置
from django.shortcuts import render, redirect from django import views # Create your views here. fro ...
- 阅读jdk源码的流程(从今天开始要阅读jdk源码)
1.java.lang 2.java.util 3.java.util.concurrent 4.java.util.concurrent.atomic 5.java.lang.reflect 6.j ...
- c编程过程中错误笔记-& 理解不深啊!
写了一个函数,删除数组里面的元素,声明如: int student_delete(int *len, struct student stu[]): 在其内部调用了另一个函数 int student_d ...
- mysql数据库监控工具-MONyog的配置和基本使用项
测试数据传输前,研发要求需要监控10万,50万,100万数量级的数据在传输过程数据库服务器的资源消耗情况,因为数据传输服务是定时任务执行,配置10秒中一次,一次处理500条,处理完10万数据可能要半个 ...
- 2018 我要告诉你的 Vue 知识大全
Vue ,React ,Angular 三大主流框架,最后我选择学习 Vue ,接触过 React ,自己感觉学习曲线有些陡峭,进而我选择了学习 Vue ,他的学习曲线平稳很多:不管选择什么框架,除了 ...
- OtterTune配置记录
0. 准备两台Ubuntu 18.04的虚拟机,安装mysql(供server-side存储调优数据用)和postgresql(供client-side存储业务数据用,这里以PostgreSQL为例. ...
- MySQL5.7 慢查询+DDL操作堵塞查询
数据库版本: mysql> select @@version; +------------+ | @@version | +------------+ | 5.7.26-log | +----- ...
- 14、前端知识点--Vue生命周期浅析
vue生命周期 每个Vue实例或组件从创建到显示再到废弃的过程就是vue的生命周期.很多时候我们希望能在这个过程中执行一些操作,于是就有了生命周期钩子. 生命周期钩子函数允许我们在实例不同阶段执行各种 ...