内存飙高问题如何排查?

目录

1、查看日志

2、查看GC情况

3、分析堆内存对象占用情况

4、分析堆内存快照文件


内存飙高如果发生在java进程上,一般情况是因为创建了大量对象导致,持续飙高说明垃圾回收跟不上对象创建的速度,或者内存泄漏导致对象无法被回收!

排查中涉及到如下命令:

jstat -gc pid 1000  查看gc情况,时间等信息,每隔一秒打印一次

jmap -histo pid | head -20 查看堆内存占用空间最大的钱20个对象类型

jmap -dump:live,format=b,file=/home/chenjian/myheapdump.hprof pid  导出堆内存快照

如果每次gc次数频繁,而且每次回收的内存空间也正常,那说明是因为对象创建速度快导致内存一直占用很高;如果每次垃圾回收的内存非常小,那么很可能是因为内存泄漏导致内存一直无法被回收 !

建一个简单的springboot程序,打成jar包,运行:

java -Xmx100m -jar JVMDemo-0.0.1-SNAPSHOT.jar

package com.cjian.jvmdemo.controller;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import java.sql.Array;
import java.util.ArrayList;
import java.util.List;/*** @Author: cjian* @Date: 2024/2/29 17:27* @Des:*/
@RestController
public class TestController {static List<User> userList = new ArrayList<>();@GetMapping("/test")public String test() {for (int i = 0; i < 30; i++) {userList.add(new User());}return "success";}static class User {byte[] b = new byte[1024 * 1024];}
}

访问test接口几次后就出现访问失败: 

1、查看日志

日志如下:

通过日志发现程序发生了oom,

2、查看GC情况

使用jstat命令查看gc情况: 

[root@localhost chenjian]# jps -l
10323 jdk.jcmd/sun.tools.jps.Jps
10217 JVMDemo-0.0.1-SNAPSHOT.jar
[root@localhost chenjian]# jstat -gc 10217 1000 5S0C         S1C         S0U         S1U          EC           EU           OC           OU          MC         MU       CCSC      CCSU     YGC     YGCT     FGC    FGCT     CGC    CGCT       GCT   0.0         0.0         0.0         0.0       6144.0       2048.0      96256.0      96109.4    31232.0    30374.1    3968.0    3632.8     14     0.600     3     0.117     4     0.007     0.7240.0         0.0         0.0         0.0       6144.0       2048.0      96256.0      96109.4    31232.0    30374.1    3968.0    3632.8     14     0.600     3     0.117     4     0.007     0.7240.0         0.0         0.0         0.0       6144.0       2048.0      96256.0      96109.4    31232.0    30374.1    3968.0    3632.8     14     0.600     3     0.117     4     0.007     0.7240.0         0.0         0.0         0.0       6144.0       2048.0      96256.0      96109.4    31232.0    30374.1    3968.0    3632.8     14     0.600     3     0.117     4     0.007     0.7240.0         0.0         0.0         0.0       6144.0       2048.0      96256.0      96109.4    31232.0    30374.1    3968.0    3632.8     14     0.600     3     0.117     4     0.007     0.724

输出说明:

S0C:第一个幸存区的大小
S1C:第二个幸存区的大小
S0U:第一个幸存区的使用大小
S1U:第二个幸存区的使用大小
EC:伊甸园区的大小
EU:伊甸园区的使用大小
OC:老年代大小
OU:老年代使用大小
MC:方法区大小
MU:方法区使用大小
CCSC:压缩类空间大小
CCSU:压缩类空间使用大小
YGC:年轻代垃圾回收次数
YGCT:年轻代垃圾回收消耗时间
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
单位:KB

发现,OC:96256.0      OU:96109.4,老年代几乎已经用完了,而且 gc正常,只是没有回收对象;

3、分析堆内存对象占用情况

使用jmap查看堆中占用内存最大的20个对象:

[root@localhost chenjian]# jmap -histo 10217 | head -20num     #instances         #bytes  class name (module)
-------------------------------------------------------1:         55050       47757536  [B (java.base@19.0.2)2:         51933        1246392  java.lang.String (java.base@19.0.2)3:          7474         889368  java.lang.Class (java.base@19.0.2)4:         23329         746528  java.util.concurrent.ConcurrentHashMap$Node (java.base@19.0.2)5:         10386         559528  [Ljava.lang.Object; (java.base@19.0.2)6:          4249         336384  [I (java.base@19.0.2)7:          7463         298520  java.util.LinkedHashMap$Entry (java.base@19.0.2)8:          8796         281472  java.util.HashMap$Node (java.base@19.0.2)9:           211         278784  Ljava.internal.vm.FillerArray; (java.base@19.0.2)10:          2940         277704  [Ljava.util.HashMap$Node; (java.base@19.0.2)11:           274         257888  [Ljava.util.concurrent.ConcurrentHashMap$Node; (java.base@19.0.2)12:          1990         175120  java.lang.reflect.Method (java.base@19.0.2)13:          9870         157920  java.lang.Object (java.base@19.0.2)14:          3146         151008  java.lang.invoke.MemberName (java.base@19.0.2)15:          2604         145824  java.util.LinkedHashMap (java.base@19.0.2)16:          2625         105000  java.lang.invoke.MethodType (java.base@19.0.2)17:          1579         101056  java.net.URL (java.base@19.0.2)18:           312         100024  [C (java.base@19.0.2)

发现有一个Byte类型的对象共占用了47757536 字节,通过一个数据类型难以判断是哪里的代码问题,我们可以使用如下命令来导出堆内存快照:

[root@localhost chenjian]# jmap -dump:live,format=b,file=/home/chenjian/myheapdump.hprof 10217
Dumping heap to /home/chenjian/myheapdump.hprof ...
Heap dump file created [66982293 bytes in 0.415 secs]
[root@localhost chenjian]# ls
JVMDemo-0.0.1-SNAPSHOT.jar  myheapdump.hprof

接着打开jvisualvm工具分析dump文件:

4、分析堆内存快照文件

文件->装入,选择 myheapdump.hprof,

由此可以分析得出是哪里的代码产生的对象导致GC无法回收 !

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

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

相关文章

力扣刷题:2.两数相加

题目&#xff1a; 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这…

枚举(蓝桥练习)(反倍数、特别数的和、找到最多的数、小蓝的漆房、小蓝和小桥的挑战)

目录 一、枚举算法介绍 二、解空间的类型 三、循环枚举解空间 四、例题 &#xff08;一、反倍数&#xff09; &#xff08;二、特别数的和&#xff09; &#xff08;三、找到最多的数&#xff09; &#xff08;四、小蓝的漆房&#xff09; &#xff08;五、小蓝和小桥的…

(C语言)Sleep函数,system函数,数组练习,详解与运用

一维数组详解&#xff1a;http://t.csdnimg.cn/zahZF 二维数组详解&#xff1a;http://t.csdnimg.cn/h2mLe 我们看过可一维数组与二维数组&#xff0c;现在我们来进行简单的练习。 题目&#xff1a;编写代码&#xff0c;演⽰多个字符从两端移动&#xff0c;向中间汇聚 1. …

Mysql索引优化导致死锁问题

1、背景 随着公司业务的发展&#xff0c;商品库存从商品中心独立出来成为一个独立的系统&#xff0c;承接主站商品库存校验、订单库存扣减、售后库存释放等业务。在上线之前我们对于核心接口进行了压测&#xff0c;压测过程中出现了MySQL 5.6.35死锁现象&#xff0c;通过日志发…

【python】Python Turtle绘制流星雨动画效果(附源码)

在这篇技术博客中&#xff0c;我们将学习如何使用 Python 的 Turtle 模块绘制一个流星雨的动画效果。通过简单的代码实现&#xff0c;我们可以在画布上展现出流星闪耀的场景&#xff0c;为视觉带来一丝神秘与美感。 一、效果图&#xff1a; 二、准备工作 &#xff08;1)、导入…

nginx介绍及编译安装

nginx介绍 是一个流行的开源的高性能的HTTP和反向代理服务器&#xff0c;也可以用作邮件代理服务器。它以其高性能、稳定性、丰富的功能集和低资源消耗而闻名 nginx特点 高性能&#xff1a; Nginx以其高效的事件驱动架构而闻名&#xff0c;能够处理大量并发连接而不会消耗过多…

nacos开启鉴权+springboot配置用户名密码

nacos默认没有开启鉴权&#xff0c;springboot无需用户名密码即可连接nacos。从2.2.2版本开始&#xff0c;默认控制台也无需登录直接可进行操作。 因此本文记录一下如何开启鉴权&#xff0c;基于nacos2.3.0版本。 编辑nacos服务端的application.properties&#xff1a; # 开…

visual studio2019怎么修改字体

点击菜单栏中的“工具” “选项” 环境 -> 字体和颜色 Consolas是vscode的默认字体&#xff0c;还挺好用的。

2024.2.28 网络

思维导图 整理面试题 1、什么是回调函数 答&#xff1a;将函数作为参数传到另一个函数里面&#xff0c;当那个函数执行完之后&#xff0c;再执行传进去的这个函数。这个过程就叫做回调。 2、结构体和共用体的区别 答&#xff1a;结构体的每个成员都会分配内存&#xff0c;…

阿里云启动实例进入了急救模式解决办法

相关文档 问题描述 通过远程连接软件无法登录Linux实例&#xff0c;通过使用管理终端连接Linux实例远程连接时&#xff0c;发现系统进入到急救模式&#xff08;emergency mode&#xff09;&#xff0c;且出现报错。 CentOS实例报如下错误。 systemctl default to try again…

Visio使用笔记

记录一下需要的常用操作 圆角矩形的弧度调整 如果一开始创建的是圆角矩形&#xff0c;可以菜单栏先改为矩形 取消箭头的对齐吸附 alt F9&#xff0c;取消勾选 忘记快捷键&#xff0c;可以菜单栏找到视图&#xff0c;点击视觉帮助右下角的小箭头&#xff0c;引出上面的界面…

字符函数与字符串函数(上)

个人主页&#xff08;找往期文章包括但不限于本期文章中不懂的知识点&#xff09;&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 目录 strlen的使用与模拟实现 函数原型&#xff1a; strlen的使用 strlen的模拟使用 strcpy的使用与模拟实现 函数原型&#xff1a; strcpy的使…