java获取到heapdump文件后怎么快速分析

heapdump文件介绍

heap dump: heap dump文件是一个二进制文件,它保存了某一时刻jvm堆中对象使用情况。heapdump文件是指定时刻的java堆栈的快照,是一种镜像文件。

产生heap dump(内存溢出)错误原因一般出于以下原因:

1)JVM内存过小,

2)程序不严密,

3)产生过多的垃圾无法回收。

立即学习“Java免费学习笔记(深入)”;

简介

在之前的OOM问题复盘之后,本周,又一Java服务出现了内存问题,这次问题不严重,只会触发堆内存占用高报警,没有触发OOM,但好在之前的复盘中总结了dump脚本,会在堆占用高时自动执行jstack与jmap,使得我们成功保留了问题现场。

查看堆占用分布

发现有heapdump文件后,我立马拷贝到本机,并使用MAT分析,如下:

java获取到heapdump文件后怎么快速分析

很显然,好像是什么接口分配了非常大的String对象,一个String对象约200MB,那它是哪分配的呢?

查找大对象分配线程

这个分配行为肯定是某个线程做的,而线程是最常见的GC Root,因此只要查找对象的GC Root即可,如下:

java获取到heapdump文件后怎么快速分析

找到了大对象对应的分配线程是http-nio-8088-exec-6,如下:

java获取到heapdump文件后怎么快速分析

查看线程栈

如何查看这个线程在干什么呢?在MAT中摸索了一会,没找到相关内容,回想起我们的dump脚本中记录了jstack,打开看看,如下:

java获取到heapdump文件后怎么快速分析

可以发现,这个线程正在做json序列化,但我仔细找了好一会,也没有找到相关接口的Controller,这是因为线程已经执行完了Controller里面的逻辑,之后返回接口响应数据时分配的大对象。

可是,线程栈中没有业务代码,就没法定位是哪个接口有问题了。。。

检查accesslog日志

考虑到分配大对象的接口肯定会很慢,于是我转向查看tomcat的accesslog日志,如下:

java获取到heapdump文件后怎么快速分析

终于,找到了问题接口,这个接口是用来查询商品数据的,当输入3时会查询出所有3开头的商品,而这有20w+数据,解决问题很简单,加个limit完事。

排查过程复盘

然而,我一直有个习惯,就是解决一个问题后,我会反思一下问题解决过程中有多少运气成分。

如果你经常阅读排查问题类的技术文章,就会发现不少文章,中间突然有一步定位到了问题根因,可能是突然发现了一个线索,或是硬看代码看出来的,或是猜测某处有问题,我觉得这种排查过程都有不少运气成分,我希望问题是通过多年理论基础的积累和对诊断工具的熟练使用,而有章法的一步步查出来的。

而上面通过accesslog能够定位到问题,有一定的运气成分,因为本次内存问题不极端,如果此接口请求量大,那就会瞬间触发多次FGC,进而会影响其它接口也变慢,进而无法分辨出哪个是导致问题的接口!

我想,从理论上来说,Java堆文件里面,应该有线程栈以及线程栈上的参数,因为线程是对象,参数也是对象,它们理应都在堆里,于是我找了个空闲时间,又摸索起MAT这个工具了。

MAT查看线程栈

摸索了一会,我就发现有这样一个按钮,可以查看线程信息,如下:

java获取到heapdump文件后怎么快速分析

找到前面说的线程http-nio-8088-exec-6,展开后,就可以发现线程栈以及栈上的参数,如下:

java获取到heapdump文件后怎么快速分析

这就找到了请求的Request参数对象,再将Request对象多次展开后,就可以找到接口url信息,如下:

java获取到heapdump文件后怎么快速分析

VisualVM查看线程栈

考虑到不少同学习惯用VisualVM分析heapdump,这里也放一下VisualVM的使用方法。

首先,加载heapdump文件,如下:

java获取到heapdump文件后怎么快速分析

然后选择相应对象,右键选择Select in Threads,如下:

java获取到heapdump文件后怎么快速分析

定位到线程栈后,找到要查看的Request对象,点击进入,如下:

java获取到heapdump文件后怎么快速分析

同样,展开Request对象后,可找到url信息,如下:

java获取到heapdump文件后怎么快速分析

以上就是java获取到heapdump文件后怎么快速分析的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2603294.html

(0)
上一篇 2025年3月6日 19:39:01
下一篇 2025年2月25日 14:22:24

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • Java怎么实现登录与注册页面

    用java实现的登录与注册页面,实现了客户端(浏览器)到服务器(tomcat)再到后端(servlet程序)数据的交互。这里在注册页面加入了验证码验证。 注册的html代码 登录后复制登录后复制    注册页面    function ch…

    2025年3月6日
    200
  • Java如何实现鲜花商城系统

    项目介绍 该项目为前后台项目,分为普通用户与管理员两种角色,前台普通用户登录,后台管理员登录; 管理员角色包含以下功能: 管理员登录,用户管理,鲜花类别管理,鲜花管理,订单管理并发货,留言管理,系统公告管理等功能。 用户角色包含以下功能: …

    2025年3月6日 编程技术
    200
  • Java中的SPI机制是什么

    1: SPI机制简介 spi 全称是 service provider interface,是一种 jdk 内置的动态加载实现扩展点的机制,通过 spi 技术我们可以动态获取接口的实现类,不用自己来创建。这个不是什么特别的技术,只是 一种设…

    2025年3月6日
    200
  • Java语言中的医疗健康应用开发介绍

    随着医疗科技的发展和互联网的普及,医疗健康应用越来越受到人们的关注。使用java语言来开发医疗健康应用不仅可以提高开发效率,还可以保证软件的稳定性和安全性。本文将介绍java语言在医疗健康应用开发中的应用。 一、Java语言的优点 Java…

    编程技术 2025年3月6日
    200
  • Java语言应用服务器的搭建方法

    随着互联网的普及和应用开发的需要,java语言应用服务器也逐渐成为了重要的支撑平台之一。它不仅可以提供运行环境,还可以支持多种程序开发语言,如java、php和python等。本文将介绍java语言应用服务器的搭建方法,帮助广大读者快速搭建…

    编程技术 2025年3月6日
    200
  • Java语言中的社交应用开发介绍

    随着社交媒体越来越普及,社交应用也成为了人们生活中不可或缺的一部分。而随着java语言的发展,越来越多的社交应用开始使用java语言来进行开发。那么本文将从java语言的角度出发,向读者介绍java语言中的社交应用开发。 一、 Java语言…

    编程技术 2025年3月6日
    200
  • Java语言中的数据库操作技巧

    java语言中的数据库操作技巧 作为一门广泛应用于企业级开发的语言,Java语言中数据库操作是必不可少的一部分。在Java开发中使用数据库为应用程序提供数据存储和管理,而大量的数据查询和数据操作又需要高效的技巧来操作数据库。本篇文章将介绍一…

    编程技术 2025年3月6日
    200
  • Java API 开发中使用 Camel 进行 ESB 集成

    esb(enterprise service bus)是随着soa(service-oriented architecture)架构的普及而兴起的一种集成方式,它提供了一种解决企业不同系统间通信及传输数据的手段。而camel则是一种用于构建…

    编程技术 2025年3月6日
    200
  • Java API 开发中使用 JNDI 进行数据库连接

    java api 开发中使用 jndi 进行数据库连接 JNDI(Java Naming and Directory Interface)是 Java API 中用于访问命名和目录服务的标准 API。在 Java 开发中,JNDI 被广泛应…

    编程技术 2025年3月6日
    200
  • Java错误:Tomcat错误,如何解决和避免

    java是一种非常流行的编程语言,被广泛用于开发web应用程序。在web开发中,tomcat作为java web服务器也是一款广泛使用的工具。然而,开发过程中难免会遭遇一些错误。这篇文章将着重介绍tomcat错误,并提供解决和避免这些错误的…

    编程技术 2025年3月6日
    200

发表回复

登录后才能评论