高级JAVA工程师解决生产环境JVM宕机Java进程挡掉操作系统内存异常实例讲解

高级JAVA工程师解决生产环境JVM宕机Java进程挡掉内存溢出实例讲解

一、事故描述

生产环境Java进程莫名挡掉,JVM宕机。监控平台报警。生产停了,老板急了,客户爆了,怎么迅速解决事故?每次出现生产事故,都是一堆旁观者,真正解决问题的人其实很少。老板在旁边顶着,客户等着回复电话,甲方等着要说法!高级工程师其实没有那么容易!

二、核心JVM日志解读

JVM宕机就是java进程直接自己消失了,在jar包同级目录,会有JVM日志,这个日志,命名如下:

在这里插入图片描述

三、分析核心日志内容

日志内容如下:

#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 29360128 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=983631, tid=0x00007fd6ba2e2700
#
# 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.983631
#

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

Current thread (0x00007fd6e4271800):  VMThread [stack: 0x00007fd6ba1e3000,0x00007fd6ba2e3000] [id=983646]

Stack: [0x00007fd6ba1e3000,0x00007fd6ba2e3000],  sp=0x00007fd6ba2e13f0,  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 (0x00007fd69cda24a0): ParallelGCFailedAllocation, mode: safepoint, requested by thread 0x00007fd5fd7cf000

核心内容:

#   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

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
系统的物理 RAM 或交换空间不足
该进程在启用 CompressedOops 的情况下运行,并且 Java 堆可能会阻碍本机堆的增长

分析一下:
肯定跟操作系统内存有关系,内存相关的引起的宕机!

四、解决方法与思路

这段错误信息表明,Java 运行时环境(JRE)遇到了内存不足的问题。以下是一些可能的解决方法:

  1. 减少系统的内存负载:关闭一些不需要的进程或程序,以释放内存。
  2. 增加物理内存或交换空间:如果可能的话,可以添加更多的物理内存或增加交换空间的大小。
  3. 检查交换备份存储是否已满:确保交换空间有足够的可用空间。
  4. 减小 Java 堆大小:通过降低 -Xmx-Xms 参数的值来减小 Java 堆的大小。
  5. 减少 Java 线程数量:如果有过多的线程,可以考虑减少线程数量。
  6. 减小 Java 线程堆栈大小:降低 -Xss 参数的值可以减小线程堆栈的大小。
  7. 设置更大的代码缓存:使用 -XX:ReservedCodeCacheSize= 参数来增加代码缓存的大小。
  8. 如果 JVM 在零基础压缩Oops 模式下运行,并且 Java 堆位于前 32GB 地址空间中,可以使用 -XX:HeapBaseMinAddress 来设置 Java 堆的基础地址,并将 Java 堆放置在 32GB 虚拟地址之上,以允许本机堆增长。

请注意,具体的解决方法可能因系统配置和应用程序的具体情况而有所不同。你可能需要根据实际情况进行一些试验和调整。此外,确保你的应用程序没有内存泄漏问题也是很重要的。如果问题仍然存在,可能需要进一步调查和分析!

第一个解决思路就是增加物理内存的容量,如果增量至2倍4倍,整个大招基本都能解决!
第二个解决思路,扩展虚拟内存的容量到2倍!让物理内存占用降低,分离出更多的闲余内存!
第三个重复整个服务器,让内存重新释放!
第四个 减小 Java 堆大小:通过降低 -Xmx-Xms 参数的值来减小 Java 堆的大小。 将之前的配置减小!

特别情况

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 JAVA进程宕机,但是当前服务器还有剩余很多的内存,为啥还会内存不足呢?

当服务器还有剩余很多的内存,但仍然出现内存不足的错误时,可能有以下几个原因:

  • 进程内部资源没有释放:通过top命令分析进程编号,若进程占用内存高但使用CPU少,说明不是进程内存死循环造成的内存开销很大,而是由进程内部资源没有释放掉。
  • Java线程出现死锁或所有线程被阻塞。
  • 数据库连接池中的连接耗尽。
  • 内存泄漏导致了OutOfMemory
  • 服务器可用内存足够,但是分配给JVM的内存被耗尽。
  • 服务程序运行过程中替换了JAR包,但是没有进行重启服务。
  • 磁盘空间满。
  • 线程池满。

如果你遇到了内存不足的错误,可以根据实际情况检查上述可能的原因,并采取相应的解决措施。

解决思路

增大 Java 堆大小:通过降低 -Xmx-Xms 参数的值来增大 Java 堆的大小。
让操作系统分配更多的内存给到JAVA进程!

如下分析启动shell脚本!

#!/bin/sh
export JAVA_HOME=/home/java/jdk1.8.0_211
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

echo '' /home/jk/nasen.pid 

java -jar -Duser.timezone=GMT+08 -Xmx8000m -Xms6000m  /home/jk/nasen.jar >/dev/null &
#注意:必须有&让其后台执行,否则没有pid生成
echo $! > /home/jk/nasen.pid # 将jar包启动对应的pid写入文件中,为停止时提供pid

五、透过现象看本质,究竟是什么本质原因导致服务器内存不足呢?

上述是通常常用解决方法,但是我还是想深究一下,究竟是什么进程导致服务器内存不足呢?
服务器物理内存32G,虚拟内存32G,JAVA堆内存配置最大6G,redis最大配置也就10G,为啥操作系统物理占用那么高?甚至快占满了,完全说不通!
linux服务执行top命令查看当前服务器负载

在这里插入图片描述

在这里插入图片描述

ps aux | sort -k4rn | head -n 10   #查看当前操作系统所有进程,内存占用从大到小排列

排查一下可疑的进程,发现有个操作系统的监控控件进程占用超大内存,杀掉之后,内存就释放了,
总结本质原因因为操作系统自带一个监控插件占用内存过大,并且与JAVA进程跟redis进程互相争夺内存资源导致事故!

笔者简介
国内某一线知名软件公司企业认证在职员工:任JAVA高级研发工程师,大数据领域专家,数据库领域专家兼任高级DBA!10年软件开发经验!现任国内某大型软件公司大数据研发工程师、MySQL数据库DBA,软件架构师。直接参与设计国家级亿级别大数据项目!并维护真实企业级生产数据库300余个!紧急处理数据库生产事故上百起,挽回数据丢失所造成的灾难损失不计其数!并为某国家级大数据系统的技术方案(国家知识产权局颁布)专利权的第一专利发明人!

在这里插入图片描述

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

mediapipe 实现姿态分析——举手检测

目录 人体姿态检测 效果展示 举手检测 行业应用 代码实现 代码分析 效果展示 代码修改,一只手举起即可 总结 啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦^_^啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦♪(^∇^*)啦啦啦…

《深入理解springCloud与微服务》笔记

第一章 微服务介绍 1.3 微服务的不足 1.3.2 分布式事务 CAP 理论,即同时满足“一致性”“可用性”和“分区容错”是 件不可能的事。 Consistency :指数据的强一致性。如果写入某个数据成功,之后读取,读到的都是新写入的数据&a…

百度云加速即将下线

关注卢松松,会经常给你分享一些我的经验和观点。 松松商城作为多年百度云加速代理商,上周接到通知:百度云加速产品计划于2024年4月30日下线,目前也无法做实名了。 同时,百度云加速也开始逐步迁移到百度云&#xff0…

【Sql】MVCC有关问题,以及锁,日志和主从复制原理

目录 MVCC 解决什么问题? 实现原理 隐式字段 undo log Read View(读视图) InnoDB 对 MVCC 的实现 锁 分类 锁升级? InnoDB 的行锁? 死锁避免? 乐观锁和悲观锁 日志 主从复制原理 主从复制的作用 MySQL主从复制解决的问题 涉…

Java基于微信小程序的校园生活互助小助手

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

vue3 el-form中嵌套el-tabale 对输入动态校验

简单案例 <el-form :model"Form" :rules"rules" ref"FormRef" class"formDiv"><el-table :data"Form.copyWriters" style"width: 100%"><el-table-column label"文案链接"><temp…

Day33:安全开发-JavaEE应用SQL预编译Filter过滤器Listener监听器访问控制

目录 JavaEE-预编译-SQL JavaEE-过滤器-Filter JavaEE-监听器-Listen 思维导图 Java知识点 功能&#xff1a;数据库操作&#xff0c;文件操作&#xff0c;序列化数据&#xff0c;身份验证&#xff0c;框架开发&#xff0c;第三方库使用等. 框架库&#xff1a;MyBatis&#…

Mysql锁与MVCC

文章目录 Mysql锁的类型锁使用MVCC快照读和当前读读视图【Read View】串行化的解决 exlpain字段解析ACID的原理日志引擎整合SpringBoot博客记录 Mysql锁的类型 MySQL中有哪些锁&#xff1a; 乐观锁&#xff08;Optimistic Locking&#xff09;&#xff1a;假设并发操作时不会发…

C语言程序环境和预处理Pt.1 - 预处理指令|预处理操作符

电脑所能识别的语言为二进制指令&#xff0c;而我们所写的C语言代码是文本信息。为了能使计算机识别并执行C语言代码&#xff0c;就需要翻译环境&#xff0c;使C语言代码翻译为二进制的指令。 1.按下编译按钮的幕后 - 程序的翻译环境 从C语言源代码到计算机可识别的二进制文件…

MTK安卓开发板_联发科开发板评估套件_安卓主板硬件开发

在介绍开发板之前&#xff0c;让我们先来区分一下核心板和开发板的区别。核心板是一种集成度高、功能完整的计算模块&#xff0c;搭载系统&#xff0c;简化了外围接口&#xff0c;体积尺寸相对较小&#xff0c;主要适用于嵌入式系统。而开发板由核心板底板组成&#xff0c;提供…

spring中事务失效的场景有哪些?

异常捕获处理 在方法中已经将异常捕获处理掉并没有抛出。 事务只有捕捉到了抛出的异常才可以进行处理&#xff0c;如果有异常业务中直接捕获处理掉没有抛出&#xff0c;事务是无法感知到的。 解决&#xff1a;在catch块throw抛出异常。 抛出检查异常 spring默认只会回滚非检…

EI级 | Matlab实现PCA-GCN主成分降维结合图卷积神经网络的数据多特征分类预测

EI级 | Matlab实现PCA-GCN主成分降维结合图卷积神经网络的数据多特征分类预测 目录 EI级 | Matlab实现PCA-GCN主成分降维结合图卷积神经网络的数据多特征分类预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现PCA-GCN主成分降维结合图卷积神经网络的数据多…

c/c++ | 求叶子结点个数 |构建B树 | 动态规划--找叶子结点个数

是这样的&#xff0c;一道代码题&#xff0c;根据输入数据&#xff0c;计算运行结果 #include<bits/stdc.h> using namespace std; vector<int>g[10]; int ans 0; void dfs(int x){if(g[x].size() 0){ans;return;}for(int i 0; i < g[x].size(); i){dfs(g[x]…

windows 安装 gitlab-runner CICD

点击搜索图标 手动输入PowerShell, 右键点击管理员权限打开&#xff0c; 一、安装 安装 gitlab runner 文档参考地址 1、下载exe执行文件 我这里是 win64 https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-windows-amd64.exe 2、创建 gitla…

基于java+springboot+vue实现的电影订票系统(文末源码+Lw+ppt)23-41

摘 要 随着网络科技的不断发展以及人们经济水平的逐步提高&#xff0c;计算机如今已成为人们生活中不可缺少的一部分&#xff0c;为电影订票方便管理&#xff0c;基于java技术设计与实现了一款简洁、轻便的管理系统。本系统解决了电影订票事务中的主要问题&#xff0c;包括个…

08.JavaScript中的编程思想,构造函数和原型对象

一、编程思想 学习 JavaScript 中基于原型的面向对象编程序的语法实现&#xff0c;理解面向对象编程的特征。 1.面向过程 面向过程就是分析出解决问题所需要的步骤&#xff0c;然后用函数把这些步骤一步一步实现&#xff0c;使用的时候再一个一个的依次 调用就可以了。 举个…

JAVA初阶数据结构栈(工程文件后续会上传)(+专栏数据结构练习是完整版)

1.栈的概念讲解(Stack)&#xff09; 定义&#xff1a;栈是一种先进后出的数据结构 要想拿到12就要把它头上的所有东西给移出去 2.栈的实现&#xff08;代码&#xff09; 2.1栈的方法逻辑的讲解 &#xff08;1&#xff09;新建一个测试类Frank &#xff08;2&#xff09;进…

基于STM32的智慧农业管理系统设计与实现

文章目录 一、前言1.1 项目介绍【1】项目功能【2】设计实现的功能【3】项目硬件模块组成 1.2 设计思路1.3 传感器功能介绍1.4 开发工具的选择 二、EMQX开源MQTT服务器框架三、购买ECS云服务器3.1 登录官网3.2 购买ECS服务器3.3 配置安全组3.4 安装FinalShell3.5 远程登录到云服…

后端给前端导出 数据excal表

pom <!-- 读取文档 --><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.15</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.poi/poi --><…

最新CLion + STM32 + CubeMX 开发环境搭建

网上有不少相关教程&#xff0c;但都是基于老版本Clion&#xff0c;新版有一些改变&#xff0c;但整体是简单了。 PS&#xff1a;本教程基于CLion 2023.3.4 安装所需工具参考&#xff1a;Clion搭建stm32开发环境&#xff08;STM32F103C8T6&#xff09;&#xff0c;有这一篇就够…