故障重现(内存篇1), 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内存分配的去榨干服务器

服务器内存总量

03143812_AoGQ.jpg

发现整个可用内存大小在 3G附近(小于)

 

加入一个JAVA程序,开启一个线程以每秒10m的内存去申请内存

代码如下:

143810_XaGn_867417.png

 

模拟第一种情况

 

运行  java -Xmx1024m -Xms1024m org.hejinbin.memory.test.TestStepByStep

 

观察JVM垃圾回收情况,发现在程序把JVM的内存的heap慢慢耗光

03143812_CxTZ.jpg

 

直到再也无法分配10m大小的对象,然后程序输出

03143812_mWn0.jpg

观察后发现, 知道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 , 能找到刚刚被杀线程的原因

类似如下

Dec 29 21:43:42 ubuntu kernel: [81664.250008] Out of memory: Kill process 4053 (java) score 919 or sacrifice child

 

2,除了内存占用过大被kill,还有哪种原因会被kill

 答: CPU时间占用过久也是会被杀掉,详情下一篇模拟

 

3,为什么我模拟的没有产生hs_err_pid*.log日志?

答: 因为日志是再进程尝试重启后产生, 当系统内存不足,系统kill掉进程,此时守护进程又尝试拉起进程,故产生了err日志。可以在进程A占用了大部分内存时手工重启线程B模拟,能在JAVA程序的运行生成该日志

 

4, 一个JAVA进程到底占用多少内存?

答:JAVA进程≈ JVM(JVM的代码区)+JVM(JVM的数据区)栈+JAVA栈(-Xss*线程数)+JAVA的NIO(对外内存)+JAVA堆(-Xmx) ​

 

另一种改进, 把SWAP关了再测试,更精确

 

欢迎关注我的公众号,专注重现各种线上的BUG

 或搜 “包子的实验室”

转载于:https://my.oschina.net/u/867417/blog/817866

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值