当前位置:首页 > 内存 > 正文

java内存泄漏如何排查

  • 内存
  • 2024-06-26 16:09:29
  • 2105

一、如何通过jProfile来分析是否存在内存泄漏方法/步骤
<1
内存分析器视图提供动态更新的内存使用情况和目标点信息的会话视图。所有视图都有多个聚合层,并且可以显示对象和用于垃圾收集的对象。本文主要介绍如何检测内存泄漏以及查找内存泄漏的几种方法。
​2
了解内存泄漏
怀疑内存泄漏的第一步是查看“Memory”和“Recordedobjects”遥测视图。当应用程序遇到内存泄漏时,视图会显示出带有波动的正线性趋势。如果这种趋势不是线性的,那么您的应用程序可能只是浪费了大量内存,而不是泄漏内存。解决办法很简单,找到占用大量内存的类别或衣服,并尝试减少类别或衣服的数量。
​3
利用差异来减少内存泄漏
查找内存泄漏根源的第一步是找到视图对象和标记对象之间的差异。可以使用微分函数来跟踪简单的内存泄漏。
注意标记视图和对象视图之间的差异,然后确定它们导致什么样的差异。然后,当更改为“热点”视图时,选择类别和问题,并观察问题实例分配到的不同列。在这里您知道实例是如何创建的。
​4
堆遍历和内存引脚
当您拍摄文件快照时,必须首先使用对象实例创建一个对象。如果您已经在动态内存视图中缩小了内存泄漏的原因,则可以使用“showselectioninheapwalker”来保存操作并启动堆遍历器。
★5
使用视图对象作为内存泄漏原因
一些内存泄漏可以追溯到集群对象。这将带来很大的保留。视图表中最大的对象是保留的最大对象。你可以使用这棵树来找出错误的想法。
【6
利用引用表查找内存泄漏原因
查找内存泄漏的核心工具是stackwalker中的引用表。反向打开收到的报告,立即可以发现不良报告。这在复杂系统中通常是不可能的。在这种情况下,您需要找到一个或多个“garbagecollectorroots”。Garbagecollectorroots是JVM中不受垃圾收集机制约束的点。当您在提取中选择传入引用或对象时,顶部的[ShowpathtoGCroot]按钮可用。
7
有很多垃圾收集器根。如果显示所有内容,可能会导致大量拥塞,如。此外,获取垃圾收集器根非常耗时。如果找到数千个根,则计算时间较长,并且消耗大量内存。为了避免这些问题,最好从单个garbagecollectorroot开始,然后根据需要慢慢增加garbagecollectorroot以使用UPtoroots。
8
垃圾收集器链接可能很长
9
使用cumulativereferences语句导致内存泄漏
在某些情况下,大小您的对象死亡您无法成功减少它。您的对象集可能仍然包含大量实例,或者在这种情况下,使用关系图不太可能有任何意义。此时,累积参考表可以在比较堆栈管理器中变得可用。AccumulatedReferences显示当前对象集中所有可能的引用类型:
通过引用方法,您可以缩小目标对象的范围。例如,您会知道哪些类型是正常的,哪些不是。
如何使用Java分析工具JProfiler查找内存泄漏?


二、如何判断内存泄漏内存泄漏是指即使使用了内存也没有释放。由于内存增加,无法区分增加的内存是被进程实际使用还是被进程泄漏。CPU占用是瞬时的、确定性的,不存在特定进程应用到CPU却未被使用的情况。稳定性测试(也称为耐久性测试或疲劳测试)需要观察是否存在内存泄漏。然而,有数千个进程在使用内存,并且仅服务器范围内的内存增长似乎不足以确定特定进程是否正在泄漏内存。因此,稳定性测试过程往往需要关注给定进程在整个过程中的内存消耗情况,比如运行3天、7天。
查看内存使用情况的命令有ps、sar、svmon、vmstat等,但在本文中我们不会重点介绍如何使用这些工具,而是从重点关注指标的角度性能测试来介绍。。当使用其他命令查看内存时,请注意相似的名称对于每个命令具有不同的含义。一定要理解这个段的真正含义。
示例1:Virtual这个词可以指内存中的PagingSpace,也可以指进程空间中占用的所有东西(包括物理内存和PagingSpace内的分页),也可以指页面。。
示例2:Nmon中的PgIn/PgOut和topas中的PageIn/PageOut指的是文件系统中的分页,vmstat中的pi/po指的是PagingSpace中的分页,而topasP中的则指的是PAGESPACE的DataSegment过程。