故障重现, 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

或搜 “包子的实验窝”
故障重现, JAVA进程内存不够时突然挂掉模拟的更多相关文章
- Android内存管理(11)*常见JVM回收机制「Java进程内存堆分代,JVM分代回收内存,三种垃圾回收器」
参考: http://www.blogjava.net/rosen/archive/2010/05/21/321575.html 1,Java进程内存堆分代: 典型的JVM根据generation(代 ...
- Jstat在分析java的内存GC时的应用
jstat工具特别强大,有众多的可选项,详细查看堆内各个部分的使用量,以及加载类的数量.使用时,需加上查看进程的进程id,和所选参数. 执行:cd $JAVA_HOME/bin中执行jstat,注意j ...
- 记一次Pod中java进程内存“异常”消耗
背景 环境:openshift3.11 开发反映部署在容器中的java应用内存持续增长,只升不降,具体为: java应用部署在容器中,配置的jvm参数为-Xms1024m -Xmx1024m,容器me ...
- 查看java进程内存简单示例
分析工具 1.jps 显示指定系统内的所有JVM进程 2.jstat 收集JVM各方面的运行数据 3.jinfo 显示JVM配置信息 4.jmap 堆快照 5.jhat 分析headdump文件 ...
- Java进程故障排查思路及步骤
故障场景 Java进程出现问题,通常表现出如下现象: Web应用响应时间长/超时,甚至不响应 CPU使用率极高/低,频繁出现Full GC,甚至OutOfMemoryError 响应时间长.超时,甚至 ...
- 死磕内存篇 --- JAVA进程和linux内存间的大小关系
运行个JAVA 用sleep去hold住 package org.hjb.test; public class TestOnly { public static void main(String[] ...
- 利用VisualVm和JMX远程监控Java进程
自Java 6开始,Java程序启动时都会在JVM内部启动一个JMX agent,JMX agent会启动一个MBean server组件,把MBeans(Java平台标准的MBean + 你自己创建 ...
- 将ShellCode注入进程内存
内存注入ShellCode的优势就在于被发现的概率极低,甚至可以被忽略,这是因为ShellCode被注入到进程内存中时,其并没有与之对应的硬盘文件,从而难以在磁盘中取证,但也存在一个弊端由于内存是易失 ...
- 故障重现(内存篇2),JAVA内存不足导致频繁回收和swap引起的性能问题
背景起因: 记起以前的另一次也是关于内存的调优分享下 有个系统平时运行非常稳定运行(没经历过大并发考验),然而在一次活动后,人数并发一上来后,系统开始卡. 我按经验开始调优,在每个关键步骤的加入如 ...
随机推荐
- 【.net 深呼吸】细说CodeDom(2):表达式、语句
在上一篇文章中,老周厚着脸皮给大伙介绍了代码文档的基本结构,以及一些代码对象与CodeDom类型的对应关系. 在评论中老周看到有朋友提到了 Emit,那老周就顺便提一下.严格上说,Emit并不是针对代 ...
- Fis3的前端工程化之路[三大特性篇之资源定位]
Fis3版本:v3.4.22 Fis3的三大特性 资源定位:获取任何开发中所使用资源的线上路径 内容嵌入:把一个文件的内容(文本)或者base64编码(图片)嵌入到另一个文件中 依赖声明:在一个文本文 ...
- ASP.NET_各个币种之间的汇率转换(实时)使用Yahoo汇率。
近期开发支付平台的时候有运用到各国的实时汇率之间的转换问题,于是在往上找了很多相关资料,以下就是一些参考网址: 1.提供API接口的网站:https://www.showapi.com:这个网站有提供 ...
- 理解CSS边框border
前面的话 边框是CSS盒模型属性中默默无闻的一个普通属性,CSS3的到来,但得边框属性重新焕发了光彩.本文将详细介绍CSS边框 基础样式 边框是一条以空格分隔的集合样式,包括边框粗细(边框宽度 ...
- .NET Core中间件的注册和管道的构建(1)---- 注册和构建原理
.NET Core中间件的注册和管道的构建(1)---- 注册和构建原理 0x00 问题的产生 管道是.NET Core中非常关键的一个概念,很多重要的组件都以中间件的形式存在,包括权限管理.会话管理 ...
- 解决 Springboot Unable to build Hibernate SessionFactory @Column命名不起作用
问题: Springboot启动报错: Caused by: org.springframework.beans.factory.BeanCreationException: Error creati ...
- Mac上MySQL忘记root密码且没有权限的处理办法&workbench的一些tips (转)
忘记Root密码肿么办 Mac上安装MySQL就不多说了,去mysql的官网上下载最新的mysql包以及workbench,先安装哪个影响都不大.如果你是第一次安装,在mysql安装完成之后,会弹出来 ...
- IT运维监控解决方案介绍
现状 •小公司/ 创业团队< 500台服务器规模 开源方案:Zabbix.Nagios.Cacti- 云服务提供商:监控宝.oneAlert等 •BAT级别> 10万台服务器 投 ...
- 关于DDD的学习资料汇总
DDD(Domain-Driven Design)领域驱动设计,第一次看到DDD是在学习ABP时,在其中的介绍中看到的.what,DDD是个什么鬼,我不是小白,是大白,没听过.于是乎,度娘查查查,找到 ...
- 【夯实PHP基础】UML序列图总结
原文地址 序列图主要用于展示对象之间交互的顺序. 序列图将交互关系表示为一个二维图.纵向是时间轴,时间沿竖线向下延伸.横向轴代表了在协作中各独立对象的类元角色.类元角色用生命线表示.当对象存在时,角色 ...