内存飙高问题如何排查?

目录

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 5
    S0C         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.724
        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.724
        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.724
        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.724
        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.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 -20
 num     #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无法回收 !

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

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

相关文章

unity学习(42)——创建(create)角色脚本(panel)——UserHandler(收)+CreateClick(发)——服务器收包2

1.解决上一次留下的问题&#xff1a; log和reg的时候也有session&#xff0c;输出看一下这两个session是同一个不&#xff1a; 实测结果reg log accOnline中的session都是同一个对象&#xff0c;但是getAccid时候的session就是另一个了。 测试结果&#xff0c;说明在LogicHan…

小程序中使用echarts地图

一、下载并安装echarts 1、下载echarts-for-weixin组件 echarts-for-weixin项目提供了一个小程序组件&#xff0c;用这种方式可以在小程序中方便地使用 ECharts。 下载ec-canvas项目&#xff08;下载地址&#xff09; ​​ 注意&#xff1a;下载的 ec-canvas 中的echarts的版本…

嵌入式怎么学?工程师学习路线都在这

在嵌入式系统领域&#xff0c;硬件与软件工程师是不可或缺的重要支柱&#xff0c;分别承担着不同的职责和角色&#xff0c;但两者又紧密相连&#xff0c;共同构成了嵌入式系统的核心。今天本文将详细探讨工程师需要学什么&#xff0c;希望对小伙伴们有所帮助。 嵌入式硬件工程师…

iOS App冷启动优化:Before Main阶段

iOS应用冷启动时&#xff0c;在 UIApplicationMain(argc, argv, nil, appDelegateClassName)方法执行前&#xff0c;主要经历以下阶段&#xff1a; 1. 执行exec&#xff08;&#xff09;启动应用程序进程 2. 加载可执行文件&#xff0c;即将应用程序的Mach-O文件加载到内存…

QT C++实践|超详细数据库的连接和增删改查操作|附源码

0&#xff1a;前言 &#x1faa7; 什么情况需要数据库? 1 大规模的数据需要处理&#xff08;比如上千上万的数据量&#xff09;2 需要把数据信息存储起来&#xff0c;无论是本地还是服务上&#xff0c;而不是断电后数据信息就消失了。 如果不是上面的原因化&#xff0c;一般…

Linux系统中make/Makefile的介绍

文章目录 前言一、make命令二、makefile功能介绍1.makefile文件的编写格式2.hello.c文件内容3.makefile文件4.安装make命令 总结 前言 在linux系统中&#xff0c;我们对项目文件进行处理的时候会不方便&#xff0c;因此我们需要对文件的编译进行自动化处理。 下面就是在Linux系…

Linux第67步_linux字符设备驱动_注册和注销

1、字符设备注册与注销的函数原型” /*字符设备注册的函数原型*/ static inline int register_chrdev(unsigned int major,\ const char *name, \ const struct file_operations *fops) /* major:主设备号&#xff0c;Limnux下每个设备都有一个设备号&#xff0c;设备号分…

接口自动化测试用例如何设计,一文搞定!

说到自动化测试&#xff0c;或者说接口自动化测试&#xff0c;多数人的第一反应是该用什么工具&#xff0c;比如&#xff1a;Python Requests、Java HttpClient、Apifox、MeterSphere、自研的自动化平台等。大家似乎更关注的是哪个工具更优秀&#xff0c;甚至出现“ 做平台的 &…

单点故障解决方案之Smart Link与Monitor Link

-SmartLink技术&#xff0c;创建Smart Link 组。在该组中&#xff0c;加入两个端口。其中1个端口是主端口&#xff0c;也称之为Master端口。另外1个端口是备份端口:也称之为 Slave 端口。 -Monitor Link 组也称之为“监控链路组&#xff0c;由上行端口和下行端口共同组成。下行…

XSS简介及xsslabs第一关

XSS被称为跨站脚本攻击(Cross-site scripting)&#xff0c;由于和CSS(CascadingStyle Sheets)重名&#xff0c;所以改为XSS。 XSS主要速于javascript语言完成恶意的攻击行为&#xff0c;因为javascript可非常灵活的操作html、css和浏览器 XSS就是指通过利用网页开发时留下的漏…

VS Code常用快捷键

前言 对于开发者而言&#xff0c;熟悉快捷键的使用&#xff0c;能够起到事半功倍的作用&#xff0c;提高工作效率。以下是我整理的一份VS Code常用快捷键清单&#xff0c;希望能够帮助到你&#xff0c;欢迎在评论区留下你的常用快捷键&#x1f91e;。 设置VS Code中的键盘快捷…

Mysql的储存引擎

储存引擎介绍 1. 文件系统 操作系统存取数据的一种机制 2. 文件系统类型 不管使用什么文件系统&#xff0c;数据内容不会变化 不同的是&#xff0c;存储空间、大小、速度 3. MySQL存储引擎 可以理解为&#xff0c;MySQL的“文件系统”&#xff0c;只不过功能更加强大 4. MySQL…

【详识JAVA语言】数据类型与变量

字面常量 在上节课HelloWorld程序中&#xff0c; System.Out.println("Hello World")&#xff1b; 语句&#xff0c;不论程序何时运行&#xff0c;输出的都是Hello World&#xff0c;其实"Hello World"就是字面常量。 public class Demo{public static …

前端JS 时间复杂度和空间复杂度

时间复杂度 BigO 算法的时间复杂度通常用大 O 符号表述&#xff0c;定义为 T(n) O(f(n)) 实际就是计算当一个一个问题量级&#xff08;n&#xff09;增加的时候&#xff0c;时间T增加的一个趋势 T(n)&#xff1a;时间的复杂度&#xff0c;也就相当于所消耗的时长 O&#xff1…

C习题002:澡堂洗澡【仅供参考】

问题 输入样例 在这里给出一组输入。例如&#xff1a; 2 5 1 3 3 2 3 3 输出样例 在这里给出相应的输出。例如&#xff1a; No代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB 栈限制 8192 KB 代码 #include<stdio.h> int main() {int N,W,s,t,p;int arr_s[…

百度挂绳验证码底图还原

声明&#xff1a; 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01;若有侵权&#xff0c;请添加&#xff08;wx&#xff1a;wyqlxl99&#xff09;联系删除 …

【python】 用来将对象持久化的 pickle 模块

pickle 模块可以对一个 Python 对象的二进制进行序列化和反序列化。说白了&#xff0c;就是它能够实现任意对象与二进制直接的相互转化&#xff0c;也可以实现对象与文本之间的相互转化。 比如&#xff0c;我程序里有一个 python 对象&#xff0c;我想把它存到磁盘里&#xff…

信息安全——概述

信息安全的目标 保密性 Confidentiality 数据保密性&#xff1a;对于未授权的个体而言&#xff0c;信息不可用 隐私性&#xff1a;确保个人能控制或确定自身那些信息可以被收集、保存&#xff0c;这些信息可以被谁公开及向谁公开 完整性 Integrity 信息的完整性、一致性&…

猜数字游戏,炸弹数,random

package com.zhang.random;import java.util.Random; import java.util.Scanner;public class RandomTest2 {public static void main(String[] args) {//随机生成一个1~100之间的数&#xff0c;提示用户猜测&#xff0c;猜大提示猜大&#xff0c;猜小提示小了&#xff0c;直到…

Vue 组件和插件:探索细节与差异

查看本专栏目录 关于作者 还是大剑师兰特&#xff1a;曾是美国某知名大学计算机专业研究生&#xff0c;现为航空航海领域高级前端工程师&#xff1b;CSDN知名博主&#xff0c;GIS领域优质创作者&#xff0c;深耕openlayers、leaflet、mapbox、cesium&#xff0c;canvas&#x…