在这里感谢最近一直阅读我文章的小伙伴,如果觉得文章对你有用,可以帮忙关注转载,需要的时候可以及时找到文章。

背景

今年Q3季度我们在推广业务方使用Iceberg,当时为了让不同业务线的用户可以使用自己的hadoop账号权限把数据写到他们的hadoop集市目录,我们在Iceberg中添加了ugi,使Flink账号代理成业务方的hadoop账号。这次的堆内存泄漏就是因为我们使用ugi错误方式引发的。

现象

通过监控,我们发现用户的Flink写Iceberg任务的堆内存呈增长趋势,没多久就报堆内存oom了。

定位过程

1.打印日志及设置oom时dump堆内存到磁盘

clusterConf.env.java.opts=-XX:+PrintGCDetails

-XX:+PrintGCDateStamps -Xloggc:${LOG_DIRS}/gc.log -XX:+HeapDumpOnOutOfMemoryError

-XX:HeapDumpPath=/tmp/${CONTAINER_ID}.dump

2.使用visualvm分析堆内存文件 (一定要计算对象保留大小有助于分析)

发现最多的实例竟然是Entry对象,开始去分析其引用(主要是想查找找有没有比较大的HashMap),

​ 如下图好多引用都是DistributedFileSystem引用的DFSclient对象。

搜下DFSClient对象,发现其数量有16000多个。DFSClient对象为什么会这么多,继续往下跟发现其被缓存到DistributedFileSystem的cache里面。

​ cache中具体缓存使用的key如图 scheme, authority,ugi,unique 其中unique可以忽略,在visualvm上看都是相同的,scheme及authority记录着几个namenode的地址,值也并不多,唯一异常的就是存在超大量的ugi对象,此时内存泄漏的真凶差不多找到了。

发现在改造的Iceberg支持代理用户的代码中,每次调用getFs方法都要重新创建一个ugi对象。

解决

ugi按用户缓存起来之后,cache里面的DFSClient对象数量就符合预期了。这个任务就再也没有发生过堆内存泄漏了。

JVM诊断及工具笔记(4) 使用visualvm分析JVM堆内存泄漏的更多相关文章

  1. MAT工具定位分析Java堆内存泄漏问题方法

    一.MAT概述与安装 MAT,全称Memory Analysis Tools,是一款分析Java堆内存的工具,可以快速定位到堆内泄漏问题.该工具提供了两种使用方式,一种是插件版,可以安装到Eclips ...

  2. JVM诊断及工具笔记(2)使用arthas定位哪里执行了System#gc()

    笔者是汽车之家实时计算平台的一名小伙伴.负责flink平台,数据湖及kafka平台的设计与开发.平时擅长做平台设计,定位及解决各种疑难杂症.第二篇文章,讲的点依旧很小,但是这次图多!!! 在这里感谢支 ...

  3. JVM的堆内存泄漏排查-性能测试

    JVM异常说明 https://testerhome.com/articles/24259 一文中已介绍了,JVM每个运行时区域--程序计数器 .Java虚拟机栈.本地方法栈.Java堆.方法区.直接 ...

  4. 性能测试之JVM的故障排查-堆内存泄漏

    JVM异常说明(超链接) 一文中已介绍了,JVM每个运行时区域--程序计数器 .Java虚拟机栈.本地方法栈.Java堆.方法区.直接内存发生OutOfMemoryError的不同原因和不同错误信息. ...

  5. JVM源码分析之堆内存的初始化

    原创申明:本文由公众号[猿灯塔]原创,转载请说明出处标注 “365篇原创计划”第十五篇. ​ 今天呢!灯塔君跟大家讲: JVM源码分析之堆内存的初始化   堆初始化 Java堆的初始化入口位于Univ ...

  6. 【c++】内存检查工具Valgrind介绍,安装及使用以及内存泄漏的常见原因

    转自:https://www.cnblogs.com/LyndonYoung/articles/5320277.html Valgrind是运行在Linux上一套基于仿真技术的程序调试和分析工具,它包 ...

  7. 6、使用jconsole+VisualVM分析JVM

    一.不断增加对象触发GC的代码 VM 参数:-Xms100m -Xmx100m -XX:+UseSerialGC import java.util.ArrayList; import java.uti ...

  8. jvm堆内存模型原理分析及堆内存分析工具jhat和MAT的使用超详细教程

  9. Java虚拟机性能管理神器 - VisualVM(6) 排查JAVA应用程序内存泄漏【转】

    Java虚拟机性能管理神器 - VisualVM(6) 排查JAVA应用程序内存泄漏[转] 标签: javajvm内存泄漏监控工具 2015-03-11 18:30 1870人阅读 评论(0) 收藏  ...

随机推荐

  1. 【机器学习基础】无监督学习(2)——降维之LLE和TSNE

    在上一节介绍了一种最常见的降维方法PCA,本节介绍另一种降维方法LLE,本来打算对于其他降维算法一并进行一个简介,不过既然看到这里了,就对这些算法做一个相对详细的学习吧. 0.流形学习简介 在前面PC ...

  2. new和@Autowired的区别

    controller层: @RequestMapping("/payment") @RestController public class WxPayController { pu ...

  3. ZYNQ 双CPU裸机运行例程

    vivado 2014.4 特殊情况:总DDR内存大于512MB,且CPU0已经占用了超过512MB,这时按以下步骤CPU1无法启动. 原因:启动入口地址限制.更改方法如下: 打开cpu1_bsp\p ...

  4. [SPDK/NVMe存储技术分析]012 - 用户态ibv_post_send()源码分析

    OFA定义了一组标准的Verbs,并提供了一个标准库libibvers.在用户态实现NVMe over RDMA的Host(i.e. Initiator)和Target, 少不了要跟OFA定义的Ver ...

  5. [SPDK/NVMe存储技术分析]010 - 理解SGL

    在NVMe over PCIe中,I/O命令支持SGL(Scatter Gather List 分散聚合表)和PRP(Physical Region Page 物理(内存)区域页), 而管理命令只支持 ...

  6. [SPDK/NVMe存储技术分析]002 - SPDK官方介绍

    Introduction to the Storage Performance Development Kit (SPDK) | SPDK概述 By Jonathan S. (Intel), Upda ...

  7. Servlet的response乱码问题

    一.response有两种输出流(编码:UTF-8): 1.字节流:response.getOutputStream().write(date.getBytes("UTF-8")) ...

  8. kafka follower如何与leader同步数据?

    Kafka的复制机制既不是完全的同步复制,也不是单纯的异步复制.完全同步复制要求All Alive Follower都复制完,这条消息才会被认为commit,这种复制方式极大的影响了吞吐率.而异步复制 ...

  9. java的jsr303校验

    因为是菜鸡,所以就还没有具体了解jsr303具体是什么 JSR是Java Specification Requests的缩写,意思是Java 规范提案.是指向JCP(Java Community Pr ...

  10. Qt的.pro文件格式解析

    Qt的.pro文件格式解析 在Qt中用qmake生成makefile文件,它是由.pro文件生成而来的,.pro文件的具体格式语法如下: 1.注释 .pro文件中注释采用#号,从"#&quo ...