内存飙高问题如何排查?

news2024/11/17 23:47:41

目录

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无法回收 !

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

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

相关文章

案例介绍:汽车售后服务网络构建与信息抽取技术应用(开源)

一、引言 在当今竞争激烈的汽车行业中&#xff0c;售后服务的质量已成为品牌成功的关键因素之一。作为一位经验丰富的项目经理&#xff0c;我曾参与构建一个全面的汽车售后服务网络&#xff0c;旨在为客户提供无缝的维修、保养和配件更换服务。这个项目的核心目标是通过高效的…

【CFD小工坊】尝试完成一个简单的溃坝流算例(1)

【CFD小工坊】尝试完成一个简单的溃坝流算例&#xff08;1&#xff09; 前言算例简介网格生成数据的读入与输出模型参数的读入网格数据及结果数据的输出 前言 我们从一个简单的算例开始&#xff0c;从实际建模过程中学习和做代码。我选择的算例是一个矩形区域内的溃坝流&#…

ES入门六:Suggesters Api实践

都是负担在很多app上&#xff0c;当我们输入某些内容时候&#xff0c;它会立即做一些补全操作&#xff0c;如果我想实现上述的需求&#xff0c;我们就可以使用ES提供的Suggesters Api。那Suggesters是如何做到的那&#xff1f;简单来说&#xff0c;Suggesters会将输入的文本拆分…

每日一练:LeeCode-707. 设计链表 【链表+虚拟头结点+设计】

每日一练&#xff1a;LeeCode-707. 设计链表 【链表虚拟头结点设计】 思路设置虚拟头节点 本文是力扣 每日一练&#xff1a;LeeCode-707. 设计链表 【链表虚拟头结点设计】 学习与理解过程&#xff0c;本文仅做学习之用&#xff0c;对本题感兴趣的小伙伴可以出门左拐LeeCode-70…

Rabbitmq消息丢失-消费者消息丢失(二)

说明&#xff1a;消费端在处理消息的过程中出现异常&#xff0c;例如&#xff1a;业务逻辑异常&#xff0c;或者消费者被停机&#xff0c;或者网络断开连接等&#xff0c;以上等情况使消息没有得到正确恰当的处理&#xff0c;也会使消息丢失。 分析&#xff1a;分析就是说明中…

中科数安|防止电脑文件资料外泄

#防止电脑文件资料泄漏# 中科数安提供了一系列解决方案来防止电脑文件资料外泄。 www.weaem.com 这些解决方案包括以下几个方面&#xff1a; 访问控制&#xff1a;实施严格的文件访问控制&#xff0c;确保只有授权的人员能够访问和编辑核心文件。使用身份验证和权限管理系统&a…

Android APK包反编译为java文件教程

方法 流程&#xff1a; test.apk -> smali文件 -> dex文件 -> jar文件 ->java 文件 将APK包解压为 smail文件 下载 apktool工具 apktool.jar 将 test.apk 和 apktool.jar放同一目录下&#xff0c;并执行以下命令 java -jar apktool.jar d -f xxx.apk -o xxx(解…

30、类和接口

文章目录 接口概念接口和类之间有何关系&#xff1f; 可以使用接口来约束类接口继承接口接口还可以继承类接口为什么可以继承类内层原因&#xff1a;接口为什么可以继承类 用得出的结论解释最初的demo接口继承类的一些限制 接口概念 接口&#xff08;Interfaces&#xff09;可…

SAP PP学习笔记 - 豆知识07 - 如何查看BOM一览

SAP标准提供了CS03&#xff0c;只能查询单个的BOM&#xff0c;如果想查看一览&#xff0c;只能自己写SQVI 查询。 有其他高招的童鞋&#xff0c;请赐教啊。 1&#xff0c;SQVI 工具 SAP MM学习笔记18- SQVI 工具_sap sqvi-CSDN博客 输入查询名&#xff0c;然后点击 登录 2&a…

C++学习笔记:set和map

set和map set什么是setset的使用 关联式容器键值对 map什么是mapmap的使用map的插入方式常用功能map[] 的灵活使用 set 什么是set set是STL中一个底层为二叉搜索树来实现的容器 若要使用set需要包含头文件 #include<set>set中的元素具有唯一性(因此可以用set去重)若用…

Linux高级编程:进程间的通信(二)、IPC

回顾 共7种方式&#xff1a; 古老的进程间通信方式&#xff1a; 管道&#xff1a; 无名管道 有名管道 信号 系统V IPC进程对象 共享内存 消息队列 信号量集 socket通信 //网络 ------------------------- 无名管道 pipe&#xff08;&#xff09; 特点&#xff1a; 用于…

CSS3笔记

1.相同优先级的样式以写在后面的为主。 2.交集选择器&#xff0c;并且 条件挨在一起 p.rich{...} /*p元素class有rich的元素*/ 3.并集选择器&#xff0c;或者 逗号隔开 .class1,class2{...}/*满足其中一个类名都会使用该样式*/ 4.后代选择器 空格 隔开 所有符合的包括孙子及…

揭秘App访问量背后的秘密:数据统计与分析

在移动互联网时代&#xff0c;App已成为人们日常生活的重要组成部分。对于App运营者来说&#xff0c;了解用户的访问量、行为习惯等数据至关重要。本文将深入探讨如何精准统计App访问量&#xff0c;为运营者提供有价值的数据支持。 一、App访问量统计的重要性 访问量是衡量A…

2024年【焊工(初级)】找解析及焊工(初级)考试技巧

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 焊工&#xff08;初级&#xff09;找解析是安全生产模拟考试一点通生成的&#xff0c;焊工&#xff08;初级&#xff09;证模拟考试题库是根据焊工&#xff08;初级&#xff09;最新版教材汇编出焊工&#xff08;初级…

【EAI 027】Learning Interactive Real-World Simulators

Paper Card 论文标题&#xff1a;Learning Interactive Real-World Simulators 论文作者&#xff1a;Mengjiao Yang, Yilun Du, Kamyar Ghasemipour, Jonathan Tompson, Leslie Kaelbling, Dale Schuurmans, Pieter Abbeel 作者单位&#xff1a;UC Berkeley, Google DeepMind, …

leetcode 移除链表元素

本题中&#xff0c;我们是要移除链表的某一个节点&#xff0c;为了确保统一操作&#xff0c;我们需要使用虚拟头节点&#xff0c;这样我们删除节点的时候&#xff0c;就是把这个要删除的节点&#xff08;当前节点cur&#xff09;的前一个节点pre&#xff0c;使得pre.next指向要…

jsp阿帕奇安装教程

1.将压缩包解压&#xff0c;存放在自己所知道的位置 2.将软件文件夹打开 使用winr &#xff0c;输入cmd运行打开 输入Java或者Javac&#xff0c;出现一大串之后表明成功 接着在所解压的软件中点开bin这个文件夹&#xff0c;找到startup.bat点击 点击之后会出现黑框&#xff0c…

Linux中断实验:定时器实现按键消抖处理

一. 简介 前面文章学习了Linux驱动按键中断实验,文章地址如下: Linux驱动按键中断实验:按键中断功能的实现-CSDN博客 本文在Linux驱动按键中断实现的基础上,使用定时器实现按键消抖处理。 二. Linux中断实验:定时器实现按键消抖处理 1. 定时器处理按键消抖的原理 按…

java使用poi、ftl将html导出word,设置视图为 页面视图

1、修改html标签&#xff0c; 加入如下内容 <html xmlns:v"urn:schemas-microsoft-com:vml" xmlns:o"urn:schemas-microsoft-com:office:office" xmlns:w"urn:schemas-microsoft-com:office:word" xmlns:m"http://schemas.microsoft.c…