用jprofiler来分析 jvm 堆 内存泄露,fullgc

这篇具有很好参考价值的文章主要介绍了用jprofiler来分析 jvm 堆 内存泄露,fullgc。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

jvm 命令和工具_个人渣记录仅为自己搜索用的博客-CSDN博客

 堆太大?

  方法1: 重新设置堆后,重启,复现.

  方法2:  切割

split -b 1M heap.bin smallfile
scp smallfile* username@mac-host:/Users/username/
cat smallfile* > heap.bin

 官网文档

JProfiler Help - HPROF snapshots

heap walker教学:

用jprofile查看hprof文件_hprof jprofile_java老张的博客-CSDN博客

通识教学:

JVM监控及诊断工具GUI篇之JProfiler_每天都要进步一点点的博客-CSDN博客

问题: 接口调用超时逐步增加

分析 - > 发现进程 cpu占比很高 -> 进一步分析是垃圾回收线程一直在工作. 

-> 在看堆 ,堆占满了.

1. 降低jvm 参数,最大内存数, 复现

2. jmap dump

jmap -dump:live,format=b,file=<filename> <PID>

3. 在JProfiler打开.

用jprofiler来分析 jvm 堆 内存泄露,fullgc

4 找到最大size (retained size )的对象. 一层一层展开 有 %比

用jprofiler来分析 jvm 堆 内存泄露,fullgc

 遇到"transitive reference" , 链接分析被中断了. 直接右键

用jprofiler来分析 jvm 堆 内存泄露,fullgc

选择 "incoming references" 

用jprofiler来分析 jvm 堆 内存泄露,fullgc

 直接定位到源头, dev环境的agent 泄露了.  本地环境上没有这个agent 看代码分析肯定也分析不出来.

用jprofiler来分析 jvm 堆 内存泄露,fullgc

    问题 "transitive reference" 是什么, 如何展开?
在Java语言中,一个对象可能会引用其他对象,这些被引用的对象也可能会引用其他对象,这样就形成了一个对象的引用链。如果在这个引用链中,存在某个对象A被其他对象引用,并且对象A也直接或间接引用了其他对象,那么这些被间接引用的对象就称为对象A的传递引用(transitive reference)。

在JVM内存管理中,如果一个对象被其他对象引用,那么这个对象就不能被垃圾回收。如果这个对象又间接引用了其他对象,那么这些间接引用的对象也不能被垃圾回收。如果这种引用关系形成了一个传递引用链,那么整个链上的所有对象都不能被垃圾回收,即使它们已经变成了不可达对象。

5. 选择最大size的类 . 刚好对象有重复.

 用jprofiler来分析 jvm 堆 内存泄露,fullgc

在 JProfiler 中,"Use Selected Object"、"Use Selected java.lang.Class Object" 和 "Use Retained Objects" 是三个不同的选项,用于在内存分析时选择对象。

  1. "Use Selected Object" 选项允许你选择一个对象,然后查看该对象的引用关系、内存使用情况和方法调用链等信息。该选项适用于分析单个对象的内存使用情况。

  2. "Use Selected java.lang.Class Object" 选项允许你选择一个类对象,然后查看该类的内存使用情况、实例数量和方法调用链等信息。该选项适用于分析某个类的内存使用情况。

  3. "Use Retained Objects" 选项允许你选择一个对象,然后查看该对象及其引用的其他对象的内存使用情况。该选项适用于分析对象之间的引用关系和内存泄漏问题。

总的来说,这三个选项的区别在于它们选择的对象不同,从而适用于不同的内存分析场景。"Use Selected Object" 选项适用于分析单个对象的内存使用情况,"Use Selected java.lang.Class Object" 选项适用于分析某个类的内存使用情况,"Use Retained Objects" 选项适用于分析对象之间的引用关系和内存泄漏问题。

5.2 凑巧方法: 直接从String 类 着手,排序.

用jprofiler来分析 jvm 堆 内存泄露,fullgc

用jprofiler来分析 jvm 堆 内存泄露,fullgc

 附录

retained size等概念

shallow size

   Shallow size是指一个对象本身占用的内存大小,

retained size

   而retained size则是指一个对象及其引用对象占用的总内存大小。简单来说,shallow size是指对象自身占用的内存大小,而retained size则是指对象及其引用的其他对象占用的总内存大小。

deep size 

  deep size是指一个对象及其引用对象占用的总内存大小,但只计算直接引用的对象。例如,一个对象A直接引用B和C两个对象,B对象又引用D和E两个对象,那么A对象的deep size就是A、B和C这三个对象的总内存大小。

因此,Retained size和Deep size的区别在于计算引用对象的深度不同,Retained size会计算间接引用的对象,而Deep size只计算直接引用的对象。

问题: " Cannot View Allocations from Heapdump in JProfiler"


HPROF snapshots do not contain any information where objects were allocated. You have to use the JProfiler profiling agent and record allocation data before taking a heap snapshot in order to use this functionality.

问题 "transitive reference" 是什么, 如何展开?


在Java语言中,一个对象可能会引用其他对象,这些被引用的对象也可能会引用其他对象,这样就形成了一个对象的引用链。如果在这个引用链中,存在某个对象A被其他对象引用,并且对象A也直接或间接引用了其他对象,那么这些被间接引用的对象就称为对象A的传递引用(transitive reference)。

在JVM内存管理中,如果一个对象被其他对象引用,那么这个对象就不能被垃圾回收。如果这个对象又间接引用了其他对象,那么这些间接引用的对象也不能被垃圾回收。如果这种引用关系形成了一个传递引用链,那么整个链上的所有对象都不能被垃圾回收,即使它们已经变成了不可达对象。
 文章来源地址https://www.toymoban.com/news/detail-474605.html

到了这里,关于用jprofiler来分析 jvm 堆 内存泄露,fullgc的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【JVM】Java内存泄露的排查思路?

    Java内存泄露(Memory Leak)是指在Java程序中,无用的对象占用了 堆内存 ,但无法被垃圾回收器回收释放,从而导致可用内存逐渐减少,最终可能导致内存耗尽或性能下降的问题。 说明一般对于内存泄漏。都是针对 堆 的。 程序一般出现内存泄漏会有 两个状态 一是一启动导致

    2024年02月13日
    浏览(46)
  • 【JVM 监控工具】性能诊断--JProfiler的使用

    性能诊断是软件工程师在日常工作中需要经常面对和解决的问题,在用户体验至上的今天,解决好应用的性能问题能带来非常大的收益。Java 作为最流行的编程语言之一,其应用性能诊断一直受到业界广泛关注。可能造成 Java 应用出现性能问题的因素非常多,例如线程控制、

    2024年02月08日
    浏览(58)
  • 什么时候会触发FullGC?描述一下JVM加载class文件的原理机制?

    什么时候会触发 FullGC? 除直接调用 System.gc 外,触发 Full GC 执行的情况有如下四种。 1. 旧生代空间不足 旧生代空间只有 在新生代对象转入及创建为大对象、大数组时才会出现不足的现象,当执行 Full GC 后空间仍然不 足,则抛出如下错误: java.lang.OutOfMemoryError: Java heap spac

    2024年02月20日
    浏览(44)
  • Go坑:time.After可能导致的内存泄露问题分析

    Go 中 time.After 可能导致的内存泄露 go v1.20.4 time 包中有 3 个比较常用的定时函数:NewTicker,NewTimer 和 time.After: NewTimer : 表示在一段时间后才执行,默认情况下执行一次。如果想再次执行,需要调用 time.Reset() 方法,这时类似于 NewTicker 定时器了。可以调用 stop 方法停止执行。

    2024年02月02日
    浏览(51)
  • 【jvm系列-09】垃圾回收底层原理和算法以及JProfiler的基本使用

    JVM系列整体栏目 内容 链接地址 【一】初识虚拟机与java虚拟机 https://blog.csdn.net/zhenghuishengq/article/details/129544460 【二】jvm的类加载子系统以及jclasslib的基本使用 https://blog.csdn.net/zhenghuishengq/article/details/129610963 【三】运行时私有区域之虚拟机栈、程序计数器、本地方法栈 https

    2023年04月22日
    浏览(58)
  • jstat命令查看jvm内存情况及GC内存变化

    jstat [Options] pid [interval] [count] 参数说明: Options,选项,一般使用 -gc、-gccapacity查看gc情况 pid,VM的进程号,即当前运行的java进程号 interval,间隔时间(按该时间频率自动刷新当前内存情况),单位毫秒 count,打印次数,如果缺省则打印无数次 查看当前jvm内存情况 jstat -gc 12675

    2024年02月01日
    浏览(60)
  • Java jvm 内存溢出分析

    我们经常用visualVm监控Jvm的内存,cpu,线程的使用情况,通常可以根据内存不断增长来判断内存是否存在不释放。但是我们不可能时时盯着去看,这里涉及jvm堆内存配置,堆内存参数配置和调优会在其他章节编写。 如果真是内存溢出了,线上出现的我们需要配置JVm内存溢出,

    2024年02月09日
    浏览(53)
  • 如何分析 JVM 内存瓶颈浅谈

    当操作系统内存出现瓶颈时,我们便会重点排查那个应用占用内存过大。对于更深一步分析内存的使用,就进一步去了解内存结构,应用程序使用情况,以及内存如何分配、如何回收,这样你才能更好地确定内存的问题。   JVM(Java虚拟机)内存分配是指Java程序运行时,JVM对

    2024年02月12日
    浏览(40)
  • jvm内存溢出排查(使用idea自带的内存泄漏分析工具)

    想分析堆内存溢出,一定在运行jar包时就写上参数 -XX:+HeapDumpOnOutOfMemoryError ,可以看我之前关于如何运行jar包的文章。若你没有写。可以写上参数,重启你的项目,等你的项目发生下一次堆内存溢出异常,在运行的同级文件夹,将产生类似这样一个文件 java_pid74935.hprof ,若你

    2024年02月09日
    浏览(54)
  • flink源码分析-获取JVM最大堆内存

    flink版本: flink-1.11.2 代码位置: org.apache.flink.runtime.util.EnvironmentInformation#getMaxJvmHeapMemory 如果设置了-Xmx参数,就返回这个参数,如果没设置就返回机器物理内存的1/4.  这里主要看各个机器内存的获取方法。 进入getSizeOfPhysicalMemory()方法,里面有获取各种操作系统物理内存的方法

    2024年02月15日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包