当前位置: 首页 > news >正文

故障重现, 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程序的运行生成该日志

 

 

http://www.lryc.cn/news/60254.html

相关文章:

  • 数画-AI绘画-免费的人工智能AI绘画网站
  • ElasticSearch安装、启动、操作及概念简介
  • Linux用户管理
  • Docker 的安装和镜像容器的基本操作
  • 被盗的ChatGPT账户在暗网热销,ChatGPT的隐私和安全问题依旧值得关注
  • OpenCV2 计算机视觉应用编程秘籍:6~10
  • 如何对农田温室气体进行有效模拟?
  • java数据结构刷题练习
  • 《商用密码应用与安全性评估》第一章密码基础知识1.6密钥交换协议
  • Qt Quick - TabBar
  • ElasticSearch集群搭建
  • 【pan-sharpening 攻击:目标检测】
  • nginx反向代理_负载均衡的配置
  • 程序员随时担心被抛弃......大厂外包值不值得去?
  • C++解释器模式实战:从设计到应用的全面指南
  • 使用华为云免费资源训练Paddle UIE模型
  • 深度学习12. CNN经典网络 VGG16
  • Doris(3):创建用户与创建数据库并赋予权限
  • 深入浅出 Golang 内存管理
  • 基于Python的简单40例和爬虫详细讲解(文末赠书)
  • Vector - CAPL - CAN x 总线信息获取(续2)
  • C++基础知识【8】模板
  • MAC-安装Java环境、JDK配置、IDEA插件推荐
  • Mysql如何避免常见的索引失效
  • SpringBoot集成Redis及问题解决
  • PyTorch 人工智能研讨会:6~7
  • AI绘图设计师Stable Diffusion成为生产力工具(五):放大并修复老照片、马赛克照片、身份证件照
  • cubase正版下载安装包-cubase正版下载v1.2.0.69 软件激活版
  • Python机器学习:支持向量机
  • 矩阵和线性代数的应用