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

news2024/11/17 5:34:37

高级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

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

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

【JVM】什么是运行时数据区?

什么是运行时数据区? 运行时数据区指的是JVM所管理的内存区域,其中分成两大类: 线程共享 – 方法区、堆 方法区:存放每一个加载的类的元信息、运行时常量池、字符串常量池。 堆:存放创建出来的对象。 线程不共享 – …

VB+ACCESS学籍管理系统-264-(代码+说明)

转载地址: http://www.3q2008.com/soft/search.asp?keyword264 设计要求: 第一:一篇论文(5000到10000字)不包括图表和程序代码。A4纸20页之内。 论文结构如下: 设计题目:学籍管理系统 附:程…

Jeff Bezos的投资正开始见效

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

计算机组成原理练习-计算机硬件组成

冯诺依曼结构计算机 1.冯诺依曼结构计算机中数据采用二进制编码表示,其主要原因是()。 I.二进制的运算规则简单 Ⅱ.制造两个稳态的物理器件较容易 Ⅲ.便于用逻辑门电路实现算术运算 A.仅I、Ⅱ B.仅I…

Spring具体拓展点:后置处理器

一图胜千言 mermaid示例图: #mermaid-svg-YEqFb5JcEk5FWkwO {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-YEqFb5JcEk5FWkwO .error-icon{fill:#552222;}#mermaid-svg-YEqFb5JcEk5FWkwO .error-text{fi…

如何注册Devin-首个全自主AI软件工程师

最近devin大火,具体的就不说了,大家应该都知道,写代码非常nb,这里说一下devin的注册方式,目前devin的内测已经开启。 官网https://www.cognition-labs.com/blog注册网址Your reliable AI software engineerhttps://pr…

腾讯云服务器地域选择方法,神仙教程,看这一篇就够了

腾讯云服务器地域怎么选择?不同地域之间有什么区别?腾讯云哪个地域好?地域选择遵循就近原则,访客距离地域越近网络延迟越低,速度越快。腾讯云百科txybk.com告诉大家关于地域的选择还有很多因素,地域节点选择…

Windows C++ 使用WinAPI实现RPC

demo下载地址:https://download.csdn.net/download/2403_83063732/88958730 1、创建IDL文件以及acf文件(创建helloworld.idl helloworld.acf) 其中IDL文件: import "oaidl.idl"; import "ocidl.idl"; [ …

C++_day3:构造函数、析构函数、拷贝构造函数

1.设计一个Per类&#xff0c;类中包含私有成员:姓名、年龄、指针成员身高、体重&#xff0c;再设计一个Stu类&#xff0c;类中包含私有成员:成绩、Per类对象p1&#xff0c;设计这两个类的构造函数、析构函数和拷贝构造函数。 程序代码&#xff1a; #include <iostream>…

L2-034: 口罩发放(Python)

为了抗击来势汹汹的 COVID19 新型冠状病毒&#xff0c;全国各地均启动了各项措施控制疫情发展&#xff0c;其中一个重要的环节是口罩的发放。 某市出于给市民发放口罩的需要&#xff0c;推出了一款小程序让市民填写信息&#xff0c;方便工作的开展。小程序收集了各种信息&…

Github 2024-03-14 Go开源项目日报 Top10

根据Github Trendings的统计,今日(2024-03-14统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Go项目9非开发语言项目1TypeScript项目1Ollama: 本地大型语言模型设置与运行 创建周期:248 天开发语言:Go协议类型:MIT LicenseStar数量:42…

基于java+springboot+mybatis+laiyu实现学科竞赛管理系统

基于javaspringbootmybatislaiyu实现学科竞赛管理系统 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 文末获…

Hackthebox - Scrambled- linux

Recon Port Scan HTTP 80 根据在 support 页面得到的信息&#xff1a; 邮箱 supportscramblecorp.com用户名 ksimpson一个用于连接 4411 端口的软件密码 ksimpson SMB 445 这里连接 SMB 服务是连不上的&#xff0c;因为禁用了 NTLM MSSQL 1443 SQL 服务也同样 Unkn…

下载指定版本的pytorch

下载网址&#xff1a;https://download.pytorch.org/whl/torch_stable.html 参考博客网址&#xff1a;https://blog.csdn.net/wusuoweiieq/article/details/132773977

【代码随想录 | 链表 04】删除链表的倒数第N个节点

文章目录 4.删除链表的倒数的第N个节点4.1题目4.2解法&#xff1a;双指针 4.删除链表的倒数的第N个节点 19.删除链表的倒数第N个节点 4.1题目 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例一&#xff1a; 输入&#xff1a;h…

github拉取项目找不到前端代码

今天从github上拉取了一个项目&#xff0c;使用docker部署在了服务器上&#xff0c; 代码正常运行&#xff0c;但是想在下载的项目中找前端代码遇到了问题&#xff0c;项目结构中的template模板只有一个页面&#xff0c;于是查看nginx配置文件 查看index.html 引入了一些js文件…

24GB内存就能跑7B参数大模型?全新训练策略GaLore助你突破内存瓶颈

训练大型语言模型&#xff0c;内存总是个大问题。 权重啊、优化器状态啊&#xff0c;都得吃内存&#xff0c;而且吃得还不少。 为了省内存&#xff0c;有人就想出了一些招儿&#xff0c;比如低秩适应&#xff08;LoRA&#xff09;&#xff0c;就是给预训练权重添点儿可训练的…

EasyRecovery恢复电脑丢失数据怎么样?

电脑是我们大家熟悉并且常用的数据存储设备&#xff0c;也是综合性非常强的数据处理设备。对于电脑设备来讲&#xff0c;最主要的数据存储介质是硬盘&#xff0c;电脑硬盘被划分成多个分区&#xff0c;在电脑上表现为C盘&#xff0c;E盘等&#xff0c;用来保存系统文件以及其他…

UDP通讯测试

参考资料&#xff1a;UNIX网络编程 实验平台&#xff1a;PC为client&#xff0c;RaspberryPi为server 基本类型和接口函数&#xff0c;参考man手册 #include <sys/socket.h>struct sockaddr {sa_family_t sa_family; /* Address family */char sa_d…

LDK加密狗的多种功能特点

LDK加密狗是一种在软件保护领域广泛应用的硬件加密设备&#xff0c;它为软件提供了强有力的版权保护&#xff0c;确保软件开发商的权益得到充分保障。本文将从LDK加密狗的工作原理、功能特点、应用场景以及未来发展等方面进行详细阐述。 LDK加密狗的工作原理基于硬件加密技术。…