jvm内存溢出问题排查Java服务自动停止问题排查

Java服务自动停止,Java服务内存溢出问题解决记录。

过程描述

服务器上的一个项目突然服务不了了,登录服务器一看,服务被停了,第一反应大概率就是内存溢出导致的,结果查看日志没有任何报错,就很奇怪,然后就在启动命令里面加上了一个命令,该命令的作用就是在发生内存溢出的时候会自动生成dump文件(jvm内存快照),把该文件下载到本地后用jvisualvm应用打开就能分析出问题。

# 当OutOfMemoryError发生时生成dump文件,-XX:HeapDumpPath指定生成后的文件存储路径
java -jar -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/test/dump/ -Xms6g -Xmx6g demo-0.0.1-SNAPSHOT.jar

过了一段时间服务又停了,日志依然没有报错,也没生成jvm内存快照文件,从这个情况来看应该是没有触发jvm内存溢出,否则已经生成内存快照文件,然后使用命令查看系统日志:

## 切换到系统日志目录 
cd /var/log
## 查看系统日志,grep 过滤一下,只查看Java相关的日志
sudo cat messages* |grep java

日志显示如下:

[zhh@official-website ~]$ cd /var/log
[zhh@official-website log]$ sudo cat messages* |grep java
Sep  3 01:49:38 official-website kernel: [27946]  1000 27946  2661073  1546426    3236        0             0 java
Sep  3 01:49:38 official-website kernel: Out of memory: Kill process 27946 (java) score 773 or sacrifice child
Sep  3 01:49:38 official-website kernel: Killed process 27946 (java) total-vm:10644292kB, anon-rss:6185704kB, file-rss:0kB, shmem-rss:0kB
Sep 21 01:49:48 official-website kernel: [ 2821]  1000  2821  2664978  1518600    3208        0             0 java
Sep 21 01:49:48 official-website kernel: Out of memory: Kill process 2821 (java) score 760 or sacrifice child
Sep 21 01:49:48 official-website kernel: Killed process 2821 (java) total-vm:10659912kB, anon-rss:6074400kB, file-rss:0kB, shmem-rss:0kB

从日志可以看出,由于Java服务占用的内存太多了,为了能保证系统的正常运行,操作系统就把Java服务kill停止了。为什么没有触发Java内存溢出的报错呢?因为设置的堆内存太大,实际使用的堆内存还没到达临界点。

这里说明一下什么情况下会触发jvm内存溢出的报错,一般两种情况:

1:实际使用内存达到设置的堆内存参数值(-Xmx)附近。

2:实际使用内存没有到达设置的堆内存参数值(-Xmx)附近,但是jvm向操作系统申请不到内存了,也就是说系统内存可能被其他服务占用或者设置的-Xmx参数过大。

继续排查,服务是部署到阿里云的服务器,所以是有内存监控的,于是就去看了内存监控,发现内存大小的占用随时间成梯度增长,涨上去就不会下来,说明内存没有被垃圾回收,那大概率就是代码写的有问题。

要找到是哪块代码有问题,最好的方法就是拿到jvm内存快照文件。通过查看内存监控后对比日志得到一个重要的信息,日志长得最猛的时间段就是系统一个视频会议功能使用的时间段,果然,在某次会议结束后进入阿里云内存监控界面一看,内存不出所料的飙升了。

然后就乘没人使用系统的时间段登录服务器,执行生成jvm内存快照的命令:

# 替换<pid>为Java进程的ID,file:输出文件名为heap.hprof,可自定义路径
jmap -dump:format=b,file=heap.hprof <pid>

注意:生成jvm内存快照的时候会影响系统的正常使用,最好是在系统闲置的时间段生成内存快照。而且如果系统内存快被占用满的时候是没法生成jvm内存快照的,因为生成内存快照也需要使用一点的内存。

jvm内存快照文件分析

拿到jvm内存快照后就使用jvisualvm打开,ps: 从jdk1.8以后包括最新几个版本的jdk1.8就已经不带jvisualvm了,如果需要jvisualvm只能自己到oracle官网去下载,新版的jvisualvm功能更齐全,不过目都是英文版。

导入内存快照文件后,界面显示一大堆对象和类,看得眼花缭乱,先不着急,先找找看看我们项目里面的类或者是对象,然后顺藤摸瓜即可,因为项目里面的对象都是互相引用的,jvisualvm会一一显示出来。

通过jvisualvm就能大概看出问题的所在了,界面显示有两个对象(FileInfo、Result)就是我们项目里面定义的,在内存中存在16万个FileInfo对象和12.7万个Result对象,通过界面的Reference引用栏和GC Root 垃圾回收根节点引用栏可以看到是被一个static变量cacheField引用,变量cacheField存在于类ReflectUtils中,好了,大概知道问题代码在哪了。

打开项目代码,看看什么情况:

结合上下文分析就可以知道,项目里面定义了一个static 变量 Map对象作为缓存存放部分对象,需要的时候从里面取,如果里面没有就放进去,只会往里面放,不会清除,最终导致Map里面存放的对象越来越多,除了重启服务,Map里面的对象是不会被清除的,因为是static修饰的类静态变量。

问题找到了就好办了,去掉缓存或者使用其他缓存方案。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙开发案例:HarmonyOS NEXT语法实现2048

【实现的功能】 • 游戏逻辑&#xff1a;实现了2048游戏的核心逻辑&#xff0c;包括初始化游戏盘面、添加随机方块、处理四个方向的滑动操作等。 • UI展示&#xff1a;构建了游戏的用户界面&#xff0c;显示得分、游戏盘面&#xff0c;并提供了重新开始按钮。 • 用户交互&…

OpenAI 公布了其新 o1 模型家族的元提示(meta-prompt)

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

出处不详 取数游戏

目录 取数游戏题目描述背景输入输出数据范围 题解解法优化 打赏 取数游戏 题目描述 背景 两人将 n n n个正整数围成一个圆环&#xff0c;规则如下&#xff1a; 第一名玩家随意选取数字&#xff1b;第二名玩家从与第一名玩家相邻的两个数字中选择一个&#xff1b;而后依次在…

科技云报到:大模型时代下,向量数据库的野望

科技云报到原创。 自ChatGPT爆火&#xff0c;国内头部平台型公司一拥而上&#xff0c;先后发布AGI或垂类LLM&#xff0c;但鲜有大模型基础设施在数据层面的进化&#xff0c;比如向量数据库。 在此之前&#xff0c;向量数据库经历了几年的沉寂期&#xff0c;现在似乎终于乘着Ch…

python 位运算 笔记

起因&#xff0c; 目的: 位运算&#xff0c;令我头疼的地方。算法题里面也是经常见到。 位运算。 按位或&#xff0c;OR, | , 只要有一个为1&#xff0c; 结果就是1&#xff0c;否则为0按位异或&#xff0c;XOR, ^, 2个数不同&#xff0c;结果为1&#xff0c; 否则为0&#…

一文介绍SQL标准1986~2023的演变

SQL标准1986年制定第一版&#xff0c;到最新的2023版&#xff0c;已经有38年的历史&#xff0c;现在依然是计算机非常活跃的语言&#xff0c;50%的程序员都能掌握SQL&#xff0c;数据分析师也是SQL的主要使用人员之一。 从早期的基本语法&#xff0c;到融合了XML、JSON等复杂数…

【Matlab 六自由度机器人】笛卡尔空间规划和关节空间规划(附MATLAB建模代码)

笛卡尔空间规划和关节空间规划 近期更新前言正文1. 笛卡尔空间规划特点&#xff1a;步骤&#xff1a; 2. 关节空间规划特点&#xff1a;步骤&#xff1a; 3. 两种方法的区别4. MATLAB代码&#xff1a;机械臂避障路径规划问题和解答4.1 关节空间规划方法4.2 笛卡尔空间规划方法4…

Java中关于算数运算符的理解

在Java中基本的算数运算符有五类 加减-乘*在编程语言中乘号一律写为 *除/在Java中两个整数相除结果还是整数取余%取得的是两个数相除的余数 这里可以看见&#xff0c;在输出加法和减法时&#xff0c;我在后面多加了一个括号&#xff0c;这是因为运算优先级的原因&#xff0c;加…

105. 从前序与中序遍历序列构造二叉树【 力扣(LeetCode) 】

文章目录 零、LeetCode 原题一、题目描述二、测试用例三、解题思路四、参考代码 零、LeetCode 原题 105. 从前序与中序遍历序列构造二叉树 一、题目描述 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的…

Hadoop集群安装

集群规划 node01node02node03角色主节点从节点从节点NameNode√DataNode√√√ResourceManager√NodeManager√√√SecondaryNameNode√Historyserver√ 上传安装包到node01 解压到指定目录 tar -zxvf /bigdata/soft/hadoop-3.3.3.tar.gz -C /bigdata/server/ 创建软链接 cd…

基于Spring Boot的医疗病历B2B平台开发策略

第4章 系统设计 4.1 系统总体设计 系统不仅要求功能完善&#xff0c;而且还要界面友好&#xff0c;因此&#xff0c;对于一个成功的系统设计&#xff0c;功能模块的设计是关键。由于本系统可执行的是一般性质的学习信息管理工作&#xff0c;本系统具有一般适用性&#xff0c;其…

49 | 桥接模式:如何实现支持不同类型和渠道的消息推送系统?

上一篇文章我们学习了第一种结构型模式&#xff1a;代理模式。它在不改变原始类&#xff08;或者叫被代理类&#xff09;代码的情况下&#xff0c;通过引入代理类来给原始类附加功能。代理模式在平时的开发经常被用到&#xff0c;常用在业务系统中开发一些非功能性需求&#xf…

Docker consul注册中心

一、consul 1.1、什么是服务注册与发现 服务注册与发现是微服务架构中不可或缺的重要组件。 起初服务都是单节点的&#xff0c;不保障高可用性&#xff0c;也不考虑服务的压力承载&#xff0c;服务之间调用单纯的通过接口访问。 直到后来出现了多个节点的分布式架构&#x…

如何看一个flutter项目的具体flutter版本

查看pubspec.lock文件 这个项目实际运行的就是 flutter 3.16.6 版本的

模电板测试分析报告【积分/微分电路】

积分电路常用于波形转换&#xff0c;如将矩形波变三角波。对正弦波积分可以实现相移。 微分电路&#xff1a; 为什么直接串联0.1uF电容到反馈线上去&#xff1a; 整改&#xff1a;这么看的话原理图中C58应该换成电阻的。 积分电路下图中红色的换成电容就可以变成微分电路了。 从…

八、随机名字功能

摘要&#xff1a; XML在C#与Unity3D中的实战运用 - PlaneZhong - 博客园 (cnblogs.com) 读取策划提供的配置文件。 策划提供一份execel文档&#xff0c;程序将它转化为一个配置文件&#xff08;xml&#xff09; 首先&#xff1a; XML是一个可扩展标记的语言 一、转换方法…

VSCode运行QT界面

VSCode用久了,感觉Qt Creator的写起代码来还是不如VSCode得心应手,虽然目前还是存在一些问题,先把目前实现的状况做个记录,后续有机会再进一步优化。 当前方式 通过QtCreator创建一个CMake项目,然后使用CMake的方式在VSCode中进行编译。 claude给出的建议 左上角的名字会…

Node.js管理工具NVM

nvm&#xff08;Node Version Manager&#xff09;是一个用于管理多个 Node.js 版本的工具。以下是 nvm 的使用方法和一些常见命令&#xff1a; 一、安装 nvm 下载 nvm&#xff1a; 地址&#xff1a;https://github.com/coreybutler/nvm-windows/releases访问 nvm 的 GitHub 仓…

【C语言】你不知道的知识小盲区——柔性数组

文章目录 一、什么是柔性数组二、柔性数组的特点三、柔性数组的使用四、柔性数组的优势 一、什么是柔性数组 也许你从来没有听说过柔性数组&#xff08;flexible array&#xff09;这个概念&#xff0c;但是它确实是存在的。在C99标准中&#xff0c;如果结构体的最后一个成员是…

sqli-labs less-26 空格绕过

空格绕过 过滤空格 用Tab代替空格%20 %09 %0a %0b %0c %0d %a0 //() 绕过空格注释符绕过//–%20//#–- -;%00; 空白字符绕过SQLite3 —— 0A,0D,0c,09,20 MYSQL 09,0A,0B,0B,0D,A0,20 PosgressSQL 0A,0D,0C,09,20 Oracle_11g 00,0A,0D,0C,09,20 MSSQL 01,02,03,04,05,06,07,…