记录最近一次线上内存泄漏排查

线上应用GC异常,为了降低影响,期间我们重启了几次。但是发现,重启后,很快老年代就被打满,无法回收。
在这里插入图片描述

dump内存快照

使用jmap,报错没权限
在这里插入图片描述
后面使用arthas执行了heapdump

分析内存使用情况

使用mat(memoryAnalyzer Tool)分析内存使用情况

很明显就是出现了内存泄漏

在这里插入图片描述

ZkEventThread中存在大量的ZkEvent

ZkEventThread中维护了一个ZkEvent的队列,ZkEventThread会依次从该队列中取ZkEvent,调用每个ZkEvent的监听。
在这里插入图片描述

ZkEvent里都是什么

查看ZkEvent的内容,发现大量的
Data of xxx changed sent to xxx,对照ZkClienta的代码,不难发现,这些都是Zk节点的DataChange事件,事件对应的zk节点都是同一个

这些ZkEvent的实现,都是ZkClient中的匿名类,下面的截图内容,对应的是ZkEvent的description属性

在这里插入图片描述

ClientRunningMonitor$1

从上图和下图都可以看到,ZkEvent对应的listener都是ClientRunningMonitor$1,而且是同一个地址
看一下ClientRunningMonitor$1的引用

ZkEvent中引用了ClientRunningMonitor$1

在这里插入图片描述

ZkClient中的dataListener引用了ClientRunningMonitor$1

在这里插入图片描述

查看ClientRunningMonitor$1的Path to GC ROOTS

结果和上面的一直,只有ZkEvent和ZkClient中的dataListener引用了
在这里插入图片描述

排查方向

经过对内存使用、代码分析,
发现CanalClusterConnector已经没有引用,但是ClientRunningMonitor$1没有取消订阅。

后续的排查方向:

  1. 为什么会出现大量的zk节点变更事件
  2. 为什么会出现CanalClusterConnector已经关闭,但ClientRunningMonitor$1没有取消订阅

问题发生的原因

为什么会出现大量的zk节点变更事件

ClientRunningMonitor内发生了循环
在这里插入图片描述

为什么ClientRunningMonitor没有取消订阅

查看ClusterCanalConnector.connect的代码,
currentConnector.connect();会调用上述的initRunning,产生循环,抛出异常
发生异常后,currentConnector.disconnect();会取消zk订阅,中断循环,
但是在currentConnector.disconnect();调用之前accessStrategy.currentNode()就已经报错了,导致disconnect失败,取消订阅失败
在这里插入图片描述

### 回答1: Java 会议纪要模板主要是为了规范化会议记录的格式,使得记录的内容更加规范、清晰,并且易于查阅。会议纪要模板一般包括以下几部分:会议主题、会议时间、与会人员、会议内容、决策和行动项、下一步计划。 会议主题是指会议讨论的主要内容,需要在会议开始前确定好,并明确在会议纪要的头部。会议时间包括会议开始和结束的时间,以及会议时长。会议参与的人员名单需要一一列出,以便随后查阅。会议内容是会议讨论的所有要点,需要详细记录,并且按照讨论的先后顺序排列。 在会议内容的基础上,需要列出会议达成的决策和行动项。决策是指会议在某个问题上做出的决定,行动项是指会议讨论后需要采取的具体行动。这一部分的记录非常重要,因为决策是实现会议目标的关键,行动项则是决策的具体实施方式。 最后,需要列出下一步的计划,包括什么时间实施行动项,以及谁来负责实施这些行动项。下一步计划是会议的最后环节,也是实现会议目标的关键环节。 综上所述,Java 会议纪要模板是一种规范化会议记录的重要工具。通过使用这种模板,可以让记录的内容更加规范、清晰,并且易于查阅,这对于会议的成功举行具有重要意义。 ### 回答2: Java 会议纪要模板是一种提供了标准格式的文档模板,用于记录和呈现会议讨论和决定的重要内容。该模板的设计旨在帮助会议参与者快速、清晰地记录会议的重要讨论和行动点,并且不需要过多地输入排版格式。 Java 会议纪要模板通常包括以下几个部分:会议主题、日期、出席者和缺席者名单、议程、会议记录、行动点和下一步行动计划。会议记录部分通常包括对会议议题的摘要和有关决定或行动的详细描述。表示行动点时,需要跟踪相应的负责人、截止日期和是否完成等信息。下一步行动计划则包括了会议结束后,参与者需在何时、何地开展下一步行动,并如何追踪和反馈。 使用 Java 会议纪要模板,可以加速会议记录及组织工作,避免人为疏漏和错误,并有助于促进事项的追踪和解决。此外,这种模板具有较好的可适应性,可根据不同类型的会议和组织需求进行调整。 总之,Java 会议纪要模板是一种实用的文档,对于记录会议内容和管理行动点非常有用。该模板的使用能够提高会议效率,节约时间和资源,有助于保持团队成员的一致性,并最大程度地达成共识。 ### 回答3: Java 会议纪要模板可以简化会议纪要的撰写过程,提高会议效率和纪要的准确性。 Java 会议纪要模板通常包括以下几个部分: 1. 会议信息:包括会议的名称、时间、地点、主持人和参会人员等基本信息,可以在会议开始前进行填写。 2. 议程:会议的议程是会议纪要的重要组成部分,它应详细列出会议讨论的各个议题和主要内容,以及每个议题的时间安排。 3. 内容记录:会议纪要的核心部分,应记录会议的讨论内容和决定事项。这些内容应该简明扼要地概括,注重重点,不必过于详尽。 4. 行动追踪:在会议记录中列出每个需要采取行动的事项,包括时间表、责任人和追踪进程等,以便于会议结束后的跟进和跟踪。 5. 附件:会议纪要附件包括会议相关的文件、报告、演示文稿等资料,以便于参会人员查看和了解更多细节。 Java 会议纪要模板的使用可以方便快捷地编写会议纪要,体现出专业、高效和规范的会议记录方式,同时也帮助参会人员更好地把握会议要点、掌握会议决策和行动计划等内容。因此,在企业及机构中,使用Java会议纪要模板已经越来越成为一个传统做法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lanicc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值