前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >总结一下jvm heap dump 分析经验

总结一下jvm heap dump 分析经验

原创
作者头像
后台技术汇
发布2024-11-28 22:01:58
发布2024-11-28 22:01:58
1500
举报

背景

我们的业务系统,过去一周内连续发生多次oom,

生成dump文件有2种办法:

  • 手动:jmap进行堆快照打印
  • 自动:jvm添加dump参数
    • -XX:+HeapDumpOnOutOfMemoryError 参数:当OutOfMemoryError发生时自动生成 Heap Dump 文件。
    • -XX:+HeapDumpBeforeFullGC 当 JVM 执行 FullGC 前执行 dump。
    • -XX:+HeapDumpAfterFullGC 当 JVM 执行 FullGC 后执行 dump。

这是一个非常有用的参数,因为当你需要分析Java内存使用情况时,往往是在OOM(OutOfMemoryError)发生时。

但文件特别大,有1.5GB,只能让运维导出来,然后本地通过jhat tlocsvn.hprof进行分析。

1、idea打不开.hprof文件

文件过大?

2、改用jhat分析文件

此前抛了异常说7000端口失败了,需要手动指定其他端口

jhat -port 8080 xxx.hprof

分析成功。

【查看堆空间分析报告】

http://localhost:8080/

浏览器页面最下面有相关功能,一般查看堆异常情况主要看这个两个部分: Show instance counts for all classes (excluding platform),平台外的所有对象信息。

【结合堆栈分析】

【结合springboot-admin分析】

https://monitor-git.woa.com/admin/instances/71179549f14d-9.165.80.233-8080/

【业务捕获OOM异常】

在tloc-svn任务代码里,有对OOM进行捕获,因此不会阻塞其他任务进行。

【业务大盘监控】

https://dp.pot.woa.com/d/5X5p75jVk/git-jvm-pod?orgId=3&var-datasource=yg-oa-prom&var-cluster=sz2-oa-tke-gitapp-pro&var-application=git-plugin-tloc-svn&var-kubernetes_pod_name=tgit-plugin-tloc-svn-6fd7d4c649-nqw75&var-jvm_memory_pool_heap=All&var-jvm_memory_pool_nonheap=All&var-app=tgit-plugin-tloc-svn

GC回收

【问题定位】

【JHAT】

jhat(JVM Heap Analysis Tool)命令是与jmap搭配使用,用来分析jmap生成的dump,jhat内置了一个微型的HTTP/HTML服务器,生成dump的分析结果后,可以在浏览器中查看。在此要注意,一般不会直接在服务器上进行分析,因为jhat是一个耗时并且耗费硬件资源的过程,一般把服务器生成的dump文件复制到本地或其他机器上进行分析

语法:

jhat [ options ] heap-dump-file

选项

  • -stack false|true 关闭对象分配调用栈跟踪(tracking object allocation call stack)。 如果分配位置信息在堆转储中不可用. 则必须将此标志设置为 false. 默认值为 true.>
  • -refs false|true 关闭对象引用跟踪(tracking of references to objects)。 默认值为 true. 默认情况下, 返回的指针是指向其他特定对象的对象,如反向链接或输入引用(referrers or incoming references), 会统计/计算堆中的所有对象。>
  • -port port-number 设置 jhat HTTP server 的端口号. 默认值 7000.>
  • -exclude exclude-file 指定对象查询时需要排除的数据成员列表文件(a file that lists data members that should be excluded from the reachable objects query)。 例如, 如果文件列列出了 java.lang.String.value , 那么当从某个特定对象 Object o 计算可达的对象列表时, 引用路径涉及 java.lang.String.value 的都会被排除。>
  • -baseline exclude-file 指定一个基准堆转储(baseline heap dump)。 在两个 heap dumps 中有相同 object ID 的对象会被标记为不是新的(marked as not being new). 其他对象被标记为新的(new). 在比较两个不同的堆转储时很有用.>
  • -debug int 设置 debug 级别. 0 表示不输出调试信息。 值越大则表示输出更详细的 debug 信息.>
  • -version 启动后只显示版本信息就退出>
  • -J< flag > 因为 jhat 命令实际上会启动一个JVM来执行, 通过 -J 可以在启动JVM时传入一些启动参数. 例如, -J-Xmx512m 则指定运行 jhat 的Java虚拟机使用的最大堆内存为 512 MB. 如果需要使用多个JVM启动参数,则传入多个 -Jxxxxxx

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档