故障重现, JAVA进程内存不够时突然挂掉模拟
背景,服务器上的一个JAVA服务进程突然挂掉,查看产生了崩溃日志,如下:
# Set larger code cache with -XX:ReservedCodeCacheSize= # This output file may be truncated or incomplete. # # Out of Memory Error (os_linux.cpp:2673), pid=28610, tid=139813184919296
日志分析原因很简单,服务器的内存不够用,导致进程崩溃
JAVA涉及到内存不够用分两种情况:
1, 当超出JVM的分配的内存时,JAVA进程并不会退出只是结束当前的线程
2, 当服务器内存不够时,linux杀死使用内存的一个进程
很简单,但很容易忽略,因为在启动JAVA进程时,服务器检查的是当前内存,并不是可用额度。如,服务器有1G内存,而启动了两个1G内存的JAVA服务是不会报错的,但当内存紧张时,linux会kill任意JAVA服务,造成影响
我用代码重现模拟下这种情况
准备如下
服务器1台,1G内存
模拟JAVA进程,以每秒递增10m内存分配的去榨干服务器
服务器内存总量
发现整个可用内存大小在 3G附近(小于)
加入一个JAVA程序,开启一个线程以每秒10m的内存去申请内存
代码如下:
模拟第一种情况:
运行 java -Xmx1024m -Xms1024m org.hejinbin.memory.test.TestStepByStep
观察JVM垃圾回收情况,发现在程序把JVM的内存的heap慢慢耗光
直到再也无法分配10m大小的对象,然后程序输出
观察后发现, 知道JVM内存被榨干,这条JAVA线程已经被停止,但JAVA进程
也是存活的,而且等待下一次垃圾回收,死去线程的内存将被回收,系统恢复。 造成的影响仅仅是影响本次请求。
模拟第二种情况:
我模拟3个JAVA服务进程,每个进程分配1G, 然后同时递增分配内存
开启多个linux窗口同时运行:
java -Xmx1024m -Xms1024m org.hejinbin.memory.test.TestStepByStep
一段时间后:
the total use : 830m
the total use : 840m
the total use : 850m
the total use : 860m
Killed
其中一条线程被kill了
另外两个进程继续跑,知道线程异常,当然最后两个进程也不会挂掉
另:观察到kswapd0占用CPU 高,交互虚拟内存
结论:
1, 当超出JVM的分配的内存时,JAVA进程并不会退出只是结束当前的线程
2, 当服务器内存不够时,linux杀死使用内存的一个进程
3, 把系统拆分成多个服务部署在同一台机时需要特别注意,JVM启动时分配的内存只是申请(其实体现在VIRT),当一台服务器运行多个JAVA进程时请保留足够的可用内存 (大于分配给各个JVM的进程之和)
接下来的问题:
1, 如何确认是因为内存过大被linux系统kill掉
答: 可以去linux的日志在/var/log/syslog 里能找到日志,如: grep "Out of memory" syslog , 能找到刚刚被杀线程的原因
2,除了内存占用过大被kill,还有哪种原因会被kill
答: CPU时间占用过久也是会被杀掉,详情下一篇模拟
3,为什么我模拟的没有产生hs_err_pid*.log日志?
答: 因为日志是再进程尝试重启后产生, 当系统内存不足,系统kill掉进程,此时守护进程又尝试拉起进程,故产生了err日志。可以在进程A占用了大部分内存时手工重启线程B模拟,能在JAVA程序的运行生成该日志
欢迎关注我的公众号,专注重现各种线上的BUG
或搜 “包子的实验窝”
最新文章
- IOS-Hybrid(混合开发)
- 每天一个 Linux 命令(22):find 命令的参数详解
- Jenkins-CVE-2016-0792漏洞利用及修复建议
- mongoDB 类型参考表
- JAVA 构造方法之间的调用
- amd(超微半导体公司(英语:Advanced Micro Devices, Inc.,缩写:AMD))
- Java多线程学习笔记--生产消费者模式
- Scrapy中使用cookie免于验证登录和模拟登录
- CCF-201409-1-相邻数对
- up61博客模版版本v1.0.0
- 使用RAP2和Mock.JS实现Web API接口的数据模拟和测试
- 深入理解Java虚拟机读书笔记1----Java内存区域与HotSpot虚拟机对象
- JAVA 垃圾收集算法,垃圾收集器与内存分配策略(内容全面,解析简单易懂)
- react的项目坑
- ES7的新特性
- Linux关闭防火墙,开放端口
- java为什么匿名内部类的参数引用时final(转)
- pycharm中导入requests,xmlx等模块的方法。
- 【SpringBoot系列5】SpringBoot整合RabbitMQ
- ASP.NET批量下载文件
热门文章
- Javascript生成二维码(QR)
- [C#] 了解过入口函数 Main() 吗?带你用批处理玩转 Main 函数
- Java中的Socket的用法
- H3 BPM:为石化企业提供一个不一样的全停大修平台
- 打开程序总是会提示“Enter password to unlock your login keyring” ,如何成功关掉?
- BZOJ1012: [JSOI2008]最大数maxnumber [线段树 | 单调栈+二分]
- C#单元测试面面观
- Nodejs之MEAN栈开发(七)---- 用Angular创建单页应用(下)
- 详解前端模块化工具-webpack
- 物联网实验4 alljoyn物联网实验之手机局域网控制设备