记一个有趣的Java OOM!
原文:https://my.oschina.net/u/1462914/blog/1630086
引言
熟悉Java的童鞋,应该对OOM比较熟悉。该类问题,一般都比较棘手。因为造成此类问题的原因有很多。今天就分享一个非常有意思的案例。(说实话。这个问题,我也是前两天才遇到的。花了不少时间来分析。觉得非常有意思,记录在此。大神勿喷!)
问题场景
重启应用时,调试到给MQ发消息时。有如下错误:
Exception in thread "Thread-4" java.lang.OutOfMemoryError: unable to create new native thread
at java.lang.Thread.start0(Native Method)
at java.lang.Thread.start(Thread.java:717)
at java.util.concurrent.ThreadPoolExecutor.addWorker(ThreadPoolExecutor.java:957)
at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1378)
at org.apache.activemq.thread.PooledTaskRunner.wakeup(PooledTaskRunner.java:81)
at org.apache.activemq.transport.failover.FailoverTransport.reconnect(FailoverTransport.java:757)
at org.apache.activemq.transport.failover.FailoverTransport.start(FailoverTransport.java:344)
at org.apache.activemq.transport.TransportFilter.start(TransportFilter.java:58)
at org.apache.activemq.transport.TransportFilter.start(TransportFilter.java:58)
一开始,以为是系统磁盘,或者内存占满导致。通过top命令查看系统信息。均属于正常范围。正在尝试寻找其他方案的同时。在SSH中输入命令是。出现以下错误:
$ bash: fork: Resource temporarily unavailable
出现上述问题后:非常明显的提示来资源不足导致。
经分析:是由于当前系统使用的线程数大于ulimit中的max_user_processes的数量导致。
Linux ulimit 参数
上面说到了,与系统(Linux)中的ulimit参数有关。ulimit 是用来限制系统资源的。
其中包括:
max memory size (最大内存大小)。
open files(打开文件数)。
max user processes(最大用户进程数)
等等。
系统性能优化常常会优化此参数。
(有兴趣的童鞋可以自行了解更多)
ulimit 常用命令:
1. 显示open files
$ ulimit -n
65535
其中 ulimit -n 显示的结果为: open files的数值。
2. 显示当前用户的最大进程数
$ ulimit -u
60000
其中ulimit -u 显示的结果为: max_user_processes额值。
2. 显示ulimit 所有属性
$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 127399
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 65535
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 60000
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
其中:
open files 表示打开文件的最大数。
max user processes 当前用户打开能打开的最大进程数。
(一) 修改 open files 数量
其中open files 属性, 可以在/etc/security/limits.conf文件中修改。在文件末尾添加。如下所示代码:
* soft nofile 65535
* hard nofile 65535
其中:
nofile 表示 open files
nproc 对应的属性为: max_user_processes
其中 65535 为演示数字。请按照环境的实际情况进行调整。
(二) 修改 max_user_processes 数量
其中 max_user_processes属性,可以在/etc/security/limits.d/90-nproc.conf路径下进行修改。
修改如下:
* soft nproc 60000
root soft nproc unlimited
需要注意的是:
max_user_processes中最大的值为: 60000。
如果设置超过60000,则默认为最大值。例如: 设置 655535,则会为60000。执行上述步骤后。退出当前会话。重新连接即可生效!在修改之前连接的会话,需要重新连接,才能看到新的配置。
查看系统资源方法
1. 查看当前系统使用的进程数。
我们可以使用: ps aux|wc -l或者ps -ef|wc -l命令来查看当前正在使用的进程数。
如下所示:
$ ps aux|wc -l
309
有时通过ps aux|wc -l 命令查看得到的数据少于max_user_processes 的值。
也出现:
$ bash: fork: Resource temporarily unavailable`
这是因为一个进程中可以包含多个线程导致。
2. 查看指定进程数中的线程数。
当我们知道了的进程ID(PID)后,
也可以通过如下方法查看当前进程中有多少个线程:
命令:
$ cat /proc/<pid>/status
案例如下:
andy@andyqian:/java$ cat /proc/11723/status
Name: java
State: S (sleeping)
Tgid: 11723
Ngid: 0
Pid: 11723
PPid: 2434
TracerPid: 0
Uid: 1000 1000 1000 1000
Gid: 1000 1000 1000 1000
FDSize: 128
Groups: 4 24 27 30 46 108 124 1000
Threads: 28
SigQ: 0/47456
Seccomp: 0
Cpus_allowed: ff
Cpus_allowed_list: 0-7
Mems_allowed: 00000000,00000001
Mems_allowed_list: 0
voluntary_ctxt_switches: 88
nonvoluntary_ctxt_switches: 3
其中:
Threads:28 就表示该进程中,一个有28个线程。
由于篇幅原因,以上删除了部分信息。
3. 如何查看应用的进程 可能有童鞋不知道如何查看应用的进程数,这里给个简单的案例:
例如查看一个名命为tomcat01的tomcat。我们可以通过如下命令查看:
ps -aux|grep tomcat01
如下所示:
andy@andyqian:/java$ ps -aux|grep tomcat01
andy 11723 0.5 1.0 6484560 127292 pts/1
其中: 11723 对应的就是tomcat01的进程ID。
记一个有趣的Java OOM!的更多相关文章
- salesforce零基础学习(一百一十五)记一个有趣的bug
本篇参考:https://help.salesforce.com/s/articleView?language=en_US&type=1&id=000319486 page layou ...
- 【bug】记一个有趣的“bug”
产品经理在使用我们用户功能的是,需要查询一个用户,知道这个用户的id,我说支持模糊查询的. 他输入"余XX",点击查询,怎么都查不出这个用户. 我到用户表里确认,确实有这个ID的用 ...
- 记一个社交APP的开发过程——基础架构选型(转自一位大哥)
记一个社交APP的开发过程——基础架构选型 目录[-] 基本产品形态 技术选型 最近两周在忙于开发一个社交App,因为之前做过一点儿社交方面的东西,就被拉去做API后端了,一个人头一次完整的去搭这么一 ...
- dubbo debug过程中一个有趣的问题
最近在debug dubbo代码过程中遇到的很有趣的问题 我们都知道dubbo ReferenceBean是消费者的spring bean包装,为了查一个consumer端的问题,在Reference ...
- Java OOM 常见情况
Java OOM 常见情况 原文:https://blog.csdn.net/qq_42447950/article/details/81435080 1)什么是OOM? OOM,全称“Out Of ...
- Java OOM学习
转载自原文: 什么是java OOM?如何分析及解决oom问题? 什么是OOM? OOM,全称"Out Of Memory",翻译成中文就是"内存用完了",表现 ...
- 举一个有趣的例子,让你轻松搞懂JVM内存管理
目录 前言 例子 源码 输出 图解 深入分析 学以致用 写在最后 前言 在JAVA虚拟机内存管理中,堆.栈.方法区.常量池等概念经常被提到,对理论知识的理解也常常停留在字面意思上,比如说堆内存中存放对 ...
- 怒肝俩月,新鲜出炉史上最有趣的Java小白手册,第一版,每个 Java 初学者都应该收藏
这么说吧,在我眼里,Java 就是最流行的编程语言,没有之一(PHP 往一边站).不仅岗位多,容易找到工作,关键是薪资水平也到位,不学 Java 亏得慌,对吧? 那可能零基础学编程的小伙伴就会头疼了, ...
- Linux环境下部署完JDK后运行一个简单的Java程序
前言 前一篇文章详细讲解了如何在Windows环境下安装虚拟机+Linux系统,并且成功部署了JDK. 不过部署完JDK之后,我们判断部署是否成功的依据是看"java -version&qu ...
随机推荐
- display:inline、block、inline-block三者之间的区别
1. display:block就是将元素显示为块级元素. block元素的特点: 总是在新行上开始: 高度,行高以及顶和底边距都可控制: 宽度缺省是它的容器的100%,除非设定一个宽度:(<d ...
- 常用python shell
路径及文件操作 创建目录 os.mkdir(path_str) 列出当前文件夹中文件,存入string list中 os.listdir(path_str) 判断路径是否存在 os.path.exis ...
- Python实例 | 贴吧签到
第一步 查看HTTP请求的内容 首先需要通过浏览器或者其他http包分析软件来观察,签到的时候进行了什么请求. Firefox浏览器就足以做到这一点,Wireshark是更加专业的包分析软件,它除了能 ...
- vue-music 关于Search(搜索页面)-- 搜索结果优化
搜索结果 列表点击跳转到相应的歌手详情页或者 歌曲页面,通过子路由跳转,和singer 组件一样 在suggest.vue 组件判断如果点击的是歌手,则new 一个歌手对象,通过这个对象的id 属性值 ...
- Codeforces 1099 C. Postcard-字符串处理(Codeforces Round #530 (Div. 2))
C. Postcard time limit per test 1 second memory limit per test 256 megabytes input standard input ou ...
- Struts2中使用Session
嗯,没错,过了这么长时间我还在做我的注册和登录. 登陆的部分自然是从数据库中查找响应的用户信息,然后把一个user放到session里, Action中代码如下: public String Logi ...
- Flask实战第48天:首页轮播图实现
首页的布局如下 因为以后所有的内容都是在main-container里面,所以这里我们修改front_base.html,把{% block body%}{% endblock%}放到里面去 < ...
- 解决vscode按下ctrl+S的时候自动格式化
按下ctrl+S的时候自动格式化 为什么需要这种操作? 优点: 保存的时候格式化,让我们的代码自动格式化,减少人工调整. 缺点: 有一些打好包的JS有时候修改一下,但不需要格式化,因为打好包就是要压缩 ...
- 中国石油大学(华东)暑期集训--二进制(BZOJ5294)【线段树】
问题 C: 二进制 时间限制: 1 Sec 内存限制: 128 MB提交: 8 解决: 2[提交] [状态] [讨论版] [命题人:] 题目描述 pupil发现对于一个十进制数,无论怎么将其的数字 ...
- shell 倒引号
`command` 倒引号 (backticks) 在前面的单双引号,括住的是字串,但如果该字串是一列命令列,会怎样?答案是不会执行.要处理这种情况,我们得用倒单引号来做. fdv=`date +%F ...