高级java工程师手把手教你解决内存不足引起JVM奔溃真实生产事故案例实战

news2025/1/12 3:47:01

高级java工程师手把手教你解决内存不足引起JVM奔溃案例实战

一、真实事故描述:

生产环境的Java程序进程,直接宕掉,进程都没有了,JVM奔溃了。生产事故,生产直接停止了,甲方爸爸客户着急了,公司老板奔溃了,恭喜你这个时候,压力转移到我这个高级工程师上了。马上解决是就是英雄,解决不了就滚蛋,这就是我的技术人生。生死存亡就看自己,与此同时很多人都在添油加醋,真正能解决问题的人,其实很少,多数其他人都是充数,在旁边叫唤,提出问题的人很多,解决问题的很少。

Java进程奔溃了,在重启。一会又奔溃了,起了又蹦,蹦了又重新启动,一般运维的思路就说如此。但是,核心的问题没有根本的解决。

二、解决问题的线索获取JVM奔溃日志

一般JVM奔溃,奔溃之前都会有JVM的日志,这种日志命名都是很佛系的。
日志位置是在当前执行JAVA的jar包同级目录
然后会出现一些有规律的日志,如下图呈现!

在这里插入图片描述

在这里插入图片描述
这种日志,每次JAVA程序奔溃一次,产生一个日志,并且是有时间戳标识,大家注意识别。

三、解读JVM奔溃的日志内容

#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 5242880 bytes for committing reserved memory.
# Possible reasons:
#   The system is out of physical RAM or swap space
#   The process is running with CompressedOops enabled, and the Java Heap may be blocking the growth of the native heap
# Possible solutions:
#   Reduce memory load on the system
#   Increase physical memory or swap space
#   Check if swap backing store is full
#   Decrease Java heap size (-Xmx/-Xms)
#   Decrease number of Java threads
#   Decrease Java thread stack sizes (-Xss)
#   Set larger code cache with -XX:ReservedCodeCacheSize=
#   JVM is running with Zero Based Compressed Oops mode in which the Java heap is
#     placed in the first 32GB address space. The Java Heap base address is the
#     maximum limit for the native heap growth. Please use -XX:HeapBaseMinAddress
#     to set the Java Heap base and to place the Java Heap above 32GB virtual address.
# This output file may be truncated or incomplete.
#
#  Out of Memory Error (os_linux.cpp:2749), pid=1181802, tid=0x00007f1b0fdfd700
#
# JRE version: Java(TM) SE Runtime Environment (8.0_211-b12) (build 1.8.0_211-b12)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.211-b12 mixed mode linux-amd64 compressed oops)
# Core dump written. Default location: /home/jk/core or core.1181802
#

---------------  T H R E A D  ---------------

Current thread (0x00007f1b38271800):  VMThread [stack: 0x00007f1b0fcfe000,0x00007f1b0fdfe000] [id=1181825]

Stack: [0x00007f1b0fcfe000,0x00007f1b0fdfe000],  sp=0x00007f1b0fdfc3f0,  free space=1016k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
V  [libjvm.so+0xad3455]  VMError::report_and_die()+0x2e5
V  [libjvm.so+0x4e0537]  report_vm_out_of_memory(char const*, int, unsigned long, VMErrorType, char const*)+0x67
V  [libjvm.so+0x910320]  os::pd_commit_memory(char*, unsigned long, unsigned long, bool)+0x100
V  [libjvm.so+0x90794f]  os::commit_memory(char*, unsigned long, unsigned long, bool)+0x1f
V  [libjvm.so+0x98c736]  PSVirtualSpace::expand_by(unsigned long)+0x56
V  [libjvm.so+0x98d9c8]  PSYoungGen::resize(unsigned long, unsigned long)+0xd8
V  [libjvm.so+0x98a166]  PSScavenge::invoke_no_policy()+0x1376
V  [libjvm.so+0x98a4fc]  PSScavenge::invoke()+0x4c
V  [libjvm.so+0x93a248]  ParallelScavengeHeap::failed_mem_allocate(unsigned long)+0x68
V  [libjvm.so+0xad4fa3]  VM_ParallelGCFailedAllocation::doit()+0x93
V  [libjvm.so+0xada1c6]  VM_Operation::evaluate()+0x46
V  [libjvm.so+0xad84fd]  VMThread::evaluate_operation(VM_Operation*) [clone .constprop.44]+0xcd
V  [libjvm.so+0xad8ae3]  VMThread::loop()+0x3a3
V  [libjvm.so+0xad8eb8]  VMThread::run()+0x78
V  [libjvm.so+0x90d952]  java_start(Thread*)+0x102

VM_Operation (0x00007f1aef4f5070): ParallelGCFailedAllocation, mode: safepoint, requested by thread 0x00007f1a78472000

奔溃的日志出奇一致,很明显内存不足,笔者这次案例很明显,找几个日志一致一样的报错,集中分析。笔者这次案例很明显,内存不足。之前的案例,有个IPV6的,可以去看我旧的文章!

结合看服务器状态综合分析

top

在这里插入图片描述


服务器状态很明显,虚拟内存饱满,物理内存不足,JAVA程序与其他服务争取内存资源,换来换去崩溃。

四、解决问题

既然问题已经定位了,怎么解决呢?生产环境,不能重启,又不能马上扩展物理内存。怎么办?
我给你的方案是,动态扩展服务器的虚拟内存方案。

方法如下:

一、查看当前虚拟内存的配置大小

free -h

在这里插入图片描述

二、创建swap文件

如果文件目录已经存在,则换个目录即可,也就是创建一个虚拟内存的页面文件!

cd /usr
mkdir swap
dd if=/dev/zero of=/usr/swap/swapfile bs=1M count=64096

提前保证路径下有剩余的空间
在这里插入图片描述

三.将目标设置为swap分区文件

mkswap /usr/swap/swapfile

在这里插入图片描述

chmod 0600 /usr/swap/swapfile       #改一下权限,系统建议0600

四、 启用swap分区文件

swapon /usr/swap/swapfile
free -h  #检查虚拟内存是否增加了

在这里插入图片描述

五、将虚拟内存的配置增加到开机自动启动配置

vim /etc/fstab         
/usr/swap/swapfile swap swap defaults 0 0  #将这个内容添加到上面的配置文件

在这里插入图片描述
保持文件退出
在这里插入图片描述

注意,现在是没有重启服务器情况下,临时增加了虚拟内存,解决了危机。生产环境,白天是不能紧急重启,如果重启,服务器也有可能起不来。所以才采用这种比较保守的方法。因为临时加内存条,也来不及!!

最终虚拟内存由之前的32G扩展到64G,页面文件有剩余,把JAVA服务,及其其他服务重启,问题暂时解决,周末的时候再扩展物理内存条。

最终总结:

笔者总结一下,JAVA的JVM奔溃,要先定位JVM的日志,而不是我们JAVA自身程序的日志。日志定位先正确。
作者是真实解决生产事故做一次真实案例,提供给JVM宕机网友们一个解决问题的思路与方法。希望写的东西能帮到你,如果真的帮到你了,记得给我点赞。
作者本人简介:现任国内某大型软件公司大数据研发工程师、MySQL数据库DBA,软件架构师。直接参与设计国家级亿级别大数据项目。并维护真实企业级生产数据库300余个。紧急处理数据库生产事故上百起,挽回数据丢失所操作的灾难损失不计其数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1274743.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用yolov7进行多图像视频识别

1.yolov7你可以让你简单的部署,比起前几代来说特别简单 #下面是我转换老友记的测试视频,可以看到几乎可以准确预测 2.步骤 1.在github官网下载代码 https://github.com/WongKinYiu/yolov7 2.点击下载权重文件放到项目中 3.安装依赖,我的python版本是3.6的 pip install -r requ…

SQL中left join、right join、inner join等的区别

一张图可以简洁明了的理解出left join、right join、join、inner join的区别: 1、left join 就是“左连接”,表1左连接表2,以左为主,表示以表1为主,关联上表2的数据,查出来的结果显示左边的所有数据&#…

如何从初级进阶中级测试工程师?测试人该具备哪些素养?

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、如何成为一枚中…

JAVA全栈开发 day14_集合(Collection\List接口、数据结构、泛型)

一、数组 数组是一个容器,可以存入相同类型的多个数据元素。 数组局限性: ​ 长度固定:(添加–扩容, 删除-缩容) ​ 类型是一致的 对象数组 : int[] arr new int[5]; … Student[] arr …

分享88个清新唯美PPT,总有一款适合您

分享88个清新唯美PPT,总有一款适合您 88个清新唯美PPT下载链接:https://pan.baidu.com/s/1XUUjxjmWFw2fJKENjk6_Yg?pwd8888 提取码:8888 Python采集代码下载链接:采集代码.zip - 蓝奏云 学习知识费力气,收集整…

【亚马逊云科技】re:Invent 2023 | Amazon Q王炸产品震撼来袭

re:Invent 2023前沿资讯快速入口➡️:2023亚马逊云科技reinvent大会,与开发者一起构建未来! 文章目录 一、2023 亚马逊云科技 re:Invent 精彩内容速递🎨二、Amazon Q 震撼来袭2.1 什么是Amazon Q?2.2 Amazon Q功能介绍…

OpenHarmony 关闭息屏方式总结

前言 OpenHarmony源码版本:4.0release 开发板:DAYU / rk3568 一、通过修改系统源码实现不息屏 修改目录:base/powermgr/power_manager/services/native/profile/power_mode_config.xml 通过文件中的提示可以知道DisplayOffTime表示息屏的…

wordpress安装之Linux ftp传输

工欲善其事,必先利其器。 最近准备在自己的服务器上搭建一个个人技术分享的平台。 因为我发现现在网络上的工具呀,还有一些问题的解答总是模棱两可,所以我打算自己做一个。 首先呢,我们需要有一个linxu的系统当服务器,然后呢&a…

d3dcompiler_47.dll缺失怎么修复?一招搞定电脑弹窗问题

在计算机使用过程中,我们常常会遇到一些错误提示,其中之一就是“d3dcompiler_47.dll缺失”。这个错误通常出现在游戏或应用程序运行时,它会导致程序无法正常启动或运行。为了解决这个问题,我们需要采取一些措施来修复缺失的文件。…

带米勒钳位的隔离驱动SiLM5350系列 工作原理、特性参数、封装形式

带米勒钳位的隔离驱动SiLM5350系列 单通道 30V,10A 带米勒钳位的隔离驱动 具有驱动电流更大、传输延时更低、抗干扰能力更强、封装体积更小等优势, 为提高电源转换效率、安全性和可靠性提供理想之选。 描述: SiLM5350系列是单通道隔离驱动器&#xff0…

2023年中国数据要素市场研究报告

第一章 概况 1.1 定义 中国数据要素交易市场是一个多层次、多维度的复杂体系,涵盖了不同的交易方式、市场类型和行业应用。数据要素作为一种新兴的生产要素,涉及社会经营活动中所有可以电子化记录、为使用者或所有者带来经济效益的数据资源。 在狭义上…

图片点击放大

在列表中添加插槽 <template slot-scope"scope">&#xff0c;获取当前点击的数据 在图片中添加点击事件的方法&#xff0c;用来弹出窗口 <vxe-columnfield"icon"title"等级图标"><template slot-scope"scope"><…

基于若依的ruoyi-nbcio流程管理系统仿钉钉流程初步完成转bpmn设计(还有bug,以后再修改)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 今天初步完成仿钉钉流程转bpmn设计的工作&#xff0c;当然还有不少bug&#xff0c;以后有需要或者网友也帮…

【android开发-01】android中toast的用法介绍

1&#xff0c;android中toast的作用 在Android开发中&#xff0c;Toast是一种用于向用户显示简短消息的轻量级对话框。它通常用于向用户提供一些即时的反馈信息&#xff0c;例如操作结果、提示或警告。 Toast的主要作用如下&#xff1a; 提供反馈&#xff1a;Toast可以在用户…

索尼PMW580视频帧EC碎片重组开启方法

索尼PMW580视频帧EC碎片重组开启方法 索尼PMW-580摄像机生成的MXF文件存在严重的碎片化&#xff0c;目前CHS零壹视频恢复程序MXF版、专业版、高级版已经支持重组结构体正常的碎片&#xff0c;同时也支持对于结构体破坏或者覆盖后仅存在音视频帧EC数据的重组&#xff0c;需要注…

记一次:Python的学习笔记二(Django项目1)

前言&#xff1a;书接上回&#xff0c;认识了Python项目环境&#xff0c;那么开始做一些案例了&#xff0c;笔者是Java出身&#xff0c;接触的也大都是web项目&#xff0c;那么Python的web项目有哪些呢&#xff1f;了解了一下有很多&#xff0c;37个之多&#xff0c;有 Django …

深入探究Photoshop图像修复与润饰技巧

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 在Photoshop中&#xff0c;图像修复和润饰是强…

KEIL:error 35: undefined line number 原因

error 35: undefined line number 是什么意思 #首先这个错误提示是仿真时候出现的&#xff0c;非编译出现 error 35: undefined line number 其次&#xff0c;这并不是什么没有编译 原因很简单&#xff0c;是因为之前设置了仿真断点&#xff0c;但是在修改程序之后&#xff0…

Linux:docker的网络通信(7)

1.端口映射 端口映射---端口映射机制将容器内的服务提供给外部网络访问 启动容器时&#xff0c;不指定对应的端口&#xff0c;在容器外无法通过网络访问容器内的服务 可随机或指定映射端口范围 -P ---------大写P&#xff0c;开启随机端口 -p 宿主机端口&#xff1a;容器端口…

力扣283题 移动零 双指针解法

移动零 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0]示例 2: 输入: nums [0] 输出…