代码编织梦想

目录


前言

项目运行过程中,我们可能会遇到Java内存溢出Out Of Memory。此时我们可以借助内存分析工具MAT(Memory Analyzer Tool),来定位是哪里出现了问题。


一、MAT(Memory Analyzer Tool

下载地址:Eclipse Memory Analyzer Open Source Project | The Eclipse Foundation

注意:JDK-8建议使用11版本,否则会提示版本不兼容

二、软件初识

解压后目录内有个MemoryAnalyzer.ini文件,该文件里面有个-Xmx参数。该参数表示最大内存占用量,默认为1024m。
建议修改为小于本机内存大小,大于要分析的dump文件大小
-startup
plugins/org.eclipse.equinox.launcher_1.5.0.v20180512-1130.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.700.v20180518-1200
-vmargs
### -Xmx1024my原本默认为1024m,此处我修改为4096m
-Xmx4096m

三、捕获dump文件

        首先在程序中模拟出一段内存溢出的逻辑:

    @RequestMapping("/testOutOfMemory")
    @ResponseBody
    public void testOutOfMemory() throws Exception {
        String name = "Aikes";
        for (int i = 0; i < 10000000; i++) {
            name += name;
        }
        System.out.println(name);
    }

        然后启动项目,开始准备捕获dump文件。这里的捕获方式分为两种,一种是主动捕获,一种是被动捕获:

1、主动方式

        顾名思义,当内存溢出发生后,通过指令的方式手机当前应用程序下的内存使用情况。

1、通过(Linux) ps -ef|grep find 或者 (Dos)netstat -ano|findstr 查找java程序运行的PID

2、使用指令收集dump:jmap -dump:format=b,file=路径/heapdump.hprof  查到的PID

注意:主动获取dump文件必须是一出现内存异常就获取dump文件,这样获取的文件信息才比较准确。如果无法及时获取,推荐通过第二种方式获取dump文件。

2、被动方式

        该方式是启动Java服务时,增加额外参数。当程序发生内存溢出时自动收集dump文件:

1、-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/oom/heapdump.hprof

        配置好后,调用我们预先模拟的内存溢出接口

        稍等片刻控制台开始打印日志,提示出现内存溢出并且已经收集到dump文件到指定目录:

四、分析dump文件

        打开下载好的mat软件,通过file-open打开抓取到的dump文件(hprof文件)

        点击切换视图,可以看到内存占用百分之八十是因为这个线程,继续点开发现是一个超大的字符串"AikesAikesAikes...."

        此时我们已经发现了内存溢出的直接原因,接下来要寻找出现这个问题的代码在哪里。再返回到最初的大饼图,点击最下面的details。然后点击See stacktrace 堆叠追踪。

        这里可以看到完整的堆栈信息,里面可以发现我们增加模拟溢出代码的那个Java文件,并且爆发内存溢出的代码行也可以对上,至此溢出分析结束。


总结

        模拟的内存溢出针对性很强,并且我们抓取dump文件也很及时,所以在分析的时候很简单。实际使用过程中面对的陷阱很多,需要从诸多可能中排查幕后凶手。Mat工具功能还很多,目前只是粗略的使用,后续如果有新的发现会继续补充到博文中。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/AikesLs/article/details/124290879

性能测试-java内存溢出问题排查_普通打工仔的博客-爱代码爱编程

背景: 最近测试一个智能呼叫系统,就是AI代替人工客服批量给客户打电话作推广活动,在测试的过程中,应用服务器和数据库服务器资源使用都挺正常的,但是长久不重启应用,过个2-3天,执行个几次同时呼叫600个电话拨打任务后,就可能存在: org.springframework.web.util.NestedServletException: Han

teamviewer安装报错: an error occured during the installation . installation aborted ! 解决方案_aikes902的博客-爱代码爱编程

        远程连接工具是程序员必备的小工具,在关键时刻还是很有用的。但是最近它提示我商业版,我通过度娘得知可以修改mac地址“骗过”teamviewer的商业检测,于是我按照步骤进行操作。当我把公司电脑tv卸载后,再次安装时报错了。         提示:An error occured during the installation . Insta

记一次java线上内存溢出问题排查_small&snail的博客-爱代码爱编程

1、top下对当前服务器内存有个大致了解 top后 shift+M按照内存占用由大到小排序,RES是此进程实际占用内存,%MEM是占服务器总内存的49.8。 2、利用ps命令查看服务pid [root@speedyao java]# ps -aux|grep java  3、利用jstat查看虚拟机堆内存情况和gc情况 jstat  -gc:

jvm内存溢出问题排查分析-爱代码爱编程

目录 问题背景 分析原因 解决方案 思考 问题背景 前段时间,公司一个老系统从resin4换成了Tomcat8.5,jdk也由1.6升级到了1.8(项目过于老,没敢升级到最新jdk),用nginx做了反向代理,部署完成,启动服务后,一切看起来都很顺利。但是不到一天的功夫就有人反映系统很卡,然后就是跳出来nginx的错误页面。赶紧连上服务器,重

Java内存溢出排查过程-爱代码爱编程

前言: 今天看到了敖丙的一篇关于排查堆内存溢出的博文,是自己没有接触过的知识,所以仿照过程自己也实验了一遍学习这部分的一些知识! 首先我使用的是Windows电脑,所以查看堆空间的插件在这里! 1、先看自己电脑的堆空间 2、下载Visual GC插件 3、执行相应的代码测试堆空间 public class jvmControl

记录一次Java内存溢出排查过程-爱代码爱编程

这两天公司的一个程序出现问题,频繁出现内存溢出错误OutOfMemory:GC overhead limit exceeded. 虽然知道这个错误的原因是因为Java虚拟机在频繁进行垃圾回收,使用了98%的时间进行垃圾回收,但是实际回收了不到2%的内存。但结合到代码中,还是无法知道为什么会出现这个问题。 程序的内存设置为3G,6G都不行,快的话10分钟

Java Web项目内存溢出问题排查-爱代码爱编程

线上的一个spring boot项目每两个周会出现系统卡死,不能正常提供api服务,重启后恢复。经过查看日志发现大量的“java.lang.OutOfMemoryError: GC overhead limit exceeded”日志。这个异常的官方解释: Exception in thread thread_name: java.lang.Out

linux 内存溢出排查_java 内存溢出 栈溢出的原因与排查方法-爱代码爱编程

1、 内存溢出的原因是什么? 内存溢出是由于没被引用的对象(垃圾)过多造成JVM没有及时回收,造成的内存溢出。如果出现这种现象可行代码排查: 一)是否应用中的类中和引用变量过多使用了Static修饰 如public staitc Student s;在类中的属性中使用 static修饰的最好只用基本类型或字符串。如public static int

java内存溢出 栈溢出的原因与排查方法-爱代码爱编程

java内存溢出 原因与排查方法 1、 内存溢出的原因是什么? 内存溢出是由于没被引用的对象(垃圾)过多造成JVM没有及时回收,导致剩余的内存不够用,造成的内存溢出。如果出现这种现象可行代码排查: 一)是否应用中的类中和引用变量过多使用了Static修饰 如public staitc Student s;在类中的属性中使用 static修饰的最好只用

java内存溢出怎么排查_【转】Java学习---内存溢出的排查经历-爱代码爱编程

前言 OutOfMemoryError 问题相信很多朋友都遇到过,相对于常见的业务异常(数组越界、空指针等)来说这类问题是很难定位和解决的。 本文以最近碰到的一次线上内存溢出的定位、解决问题的方式展开;希望能对碰到类似问题的同学带来思路和帮助。 主要从表现-->排查-->定位-->解决 四个步骤来分析和解决问题。 表象 最近

java内存溢出怎么排查_Java内存溢出OutOfMemoryError的产生与排查-爱代码爱编程

在java的虚拟机异常中,有两个异常是大家比较关心的,一个是StackOverflowError,另一个是OutOfMemoryError。今天我们就来看看OutOfMemoryError是怎么产生的,以及如何去排查这个异常。 概念 要了解什么是OutOfMemoryError,我们可以直接看一下OutOfMemoryError的源码,在类上的英文

java内存溢出怎么排查_java线上内存溢出问题排查步骤-爱代码爱编程

一般线上遇到比较头疼的就是OOM内存溢出问题,我们都会先看错误日志,如果错误日志能够定位出哪个类对象导致内存溢出,那么我们只需要针对问题修改bug就好。但是很多时候我们单凭日志无法定位出内存溢出问题,那么我们这时候就需要以下操作来定位问题。 1、top下对当前服务器内存有个大致了解 top后 shift+M俺内存占用由大到小排序,RES是此进程

java内存溢出怎么排查_Java内存溢出问题排查记录-爱代码爱编程

某日,运维同学反馈生产环境有故障,某个JVM进程CPU负载一直居高不下。登入服务器用 top -c 命令查看如下: top - 00:37:39 up 48 days, 10:41, 5 users, load average: 3.34, 3.18, 3.10 Tasks: 166 total, 1 running, 165 sleeping,

java 如何排查内存溢出_java 内存溢出排查-爱代码爱编程

测试代码,如下示例: import java.util.ArrayList; import java.util.List; /** * @Description 测试内存溢出, 启动时设置参数,最大堆内存为1m, 内存溢出时dump出内存文件 -Xmx1m -XX:+HeapDumpOutOfMemoryError * @Author luz

java 排查内存溢出_Java 内存溢出排查-爱代码爱编程

标签: Java OOM 毫无疑问是开发人员常见并且及其痛恨的问题,但是任何服务的开发都没法避免 OOM。 因此,OOM 的排查及定位是每个 Java 工程师都必备的技能。 所遇到的问题 在使用 scala 开发的一个 web 服务,在用户使用中,经常出现: java.lang.OutOfMemoryError: Java heap space 

JVM内存溢出问题排查-爱代码爱编程

       JVM虚拟机有自己的垃圾回收机制,一般情况下无需担心内存溢出的问题。但不是绝对的无需担心。        最近遇到一个服务器内存溢出问题,起因是使用了一个永不会关闭的线程,去做PDF上传下载,程序能正常运行一周,然后内存溢出。每日增量增加80多MB内存,并不会被GC回收。 内存溢出一般可能存在的情况:        1、实例化对象太大,超出

分析Java的内存溢出问题(OutofMemory)-爱代码爱编程

我们开发一个测试程序,来模拟OutofMemory情况。 程序很简单,代码如下: import java.util.ArrayList; import java.util.List;   public class Test {     public static void main(String[] args) {         List<