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

java内存泄漏排查工具

  • 内存
  • 2024-09-06 04:16:42
  • 5222

一、如何通过jProfile来分析是否存在内存泄漏方法/步骤
1
JProfiler内存视图会话提供动态更新的内存使用视图和分配点的信息视图。所有视图都有多个聚合层,可以显示现有对象和垃圾收集对象。本文主要介绍如何查找内存泄漏以及查找内存泄漏的一些方法。
​2
检测内存泄漏
怀疑内存泄漏的第一步是查看“内存”和“记录对象”遥测视图。当应用程序遇到内存泄漏时,显示屏会显示出带有振荡的线性正趋势。如果没有这样的线性流,您的应用程序可能只是使用大量内存而不是泄漏内存。解决办法很简单,找到使用大量内存的类或数组,并尝试减少类或数组的数量。
3
利用差异来减少内存泄漏
查找内存泄漏根源的第一步是找到对象视图和记录的对象视图之间的差异。使用微分函数可以轻松检测内存泄漏。
注意对象视图和记录的对象视图之间的差异,然后找出哪个类导致了差异。然后,当切换到“热点”视图时,选择一个问题类别并观察提供问题示例的差异列。到这里,你就知道例子是如何制作的了。
​4
堆遍历器和内存泄漏
在拍摄一组快照时,首先需要创建一个包含对象实例的对象集。如果您已经在动态内存显示中缩小了内存泄漏的来源,则可以使用“showselectioninheapwalker”来保存操作并启动堆遍历器。
5
使用对象视图查找内存泄漏的根源
大多数内存泄漏都可以追溯到对象簇。这将导致一些保留尺寸较大的对象。最大对象视图列出了保留大小最大的对象。您可以使用此树进行深入查找以查找不正确的引用。
【6
使用引用映射查找内存泄漏源
查找内存泄漏的核心工具是堆遍历器中的引用映射。依次打开传入的推荐,您可能会立即发现不良推荐。在复杂的系统中,这通常是不可能的。在这种情况下,您必须找到一个或多个“garbagecollectorroots”。Garbagecollectorroots是JVM中不受垃圾收集机制约束的点。当您在绘图中选择传入参考或对象时,顶部的[ShowpathtoGCroot]按钮将启用。
7
垃圾收集器根有很多,如果全部显示,可能会造成大量堆积,如。此外,找到垃圾收集器的根也很耗时。如果找到数千个根,则计算时间较长,并且消耗大量内存。为了避免这一问题,最好从一个garbagecollectorroot开始,然后根据需要使用UPtoroots慢慢增加garbagecollectorroot。
8
垃圾收集器根链可能会很长
9
使用cumulatedreferencesviews来查找内存泄漏的来源
在某些情况下,您可能无法成功减小对象设置的大小。您的对象集可能仍然包含大量实例,或者在这种情况下,使用参考图可能无法提供任何见解。这时候,堆栈遍历器的引用视图中累积的引用表就可以派上用场了。Cumululatedincomingreferencetable显示当前对象集中所有可能的引用类型:
从引用类型中,您可以缩小对象集的范围。例如,您可能知道哪些类型的推荐是常见的,哪些类型是不常见的。
如何使用Java分析工具JProfiler查找内存泄漏


二、如何使用VisualVM检测Java内存泄漏

Java的一个重要优点是垃圾收集器(GarbageCollection)自动管理内存回收,程序员不需要关注它。程序员真的不需要关注内存管理吗?每当您遇到OutOfMemoryError时,您就知道这不是真的。

这里我将展示如何使用VisualVM快速检测内存泄漏。首先看下面的代码:

;
ist;
publicclassMemoryLeakDemo{
publicstaticvoidmain(String[]args){
newThread(newMemoryLeak(),"MemoryLeak").start();
}
}
classMemoryLeak实现Runnable{
publicstaticListLeakList=newArrayList();
publicvoidrun(){
intcount=0;
while(true){
try{
(3);
}catch(InterruptedExceptione){
}
count++;>线程“MemoryLeak”emoryError中出现异常:处的Java堆空间。copyOf()
在()
在ExplicitCapacity()
在CapacityInternal()
在()
在()
()

PSYoungGen总计3584K,已使用298K[0x00000000ff980000,0x00000000ffe80000,0x0000,0x0000]72K,已使用9%[0x00000000ff980000,0x00000000ff9ca908,0x00000000ffc80000)
从512K空间,已使用0%[0x00000000ffc80000,0000000,0000000,0000000,0000000000)
到512K空间,0%使用[0x00000000ffe00000,0x00000000ffe00000,0x00000000ffe80000)
ParOldGen总计13824K,已使用12156K[0x00000000fec00000,0x00000000ff980000,0x00000000ff980000)
对象空间13824K,已使用0x00000000ff7df3e8,0x00000000ff980000)
元空间已使用7993K,容量8164K,已提交8448K,保留1056768K
类空间已使用912K,容量954K,已提交1024K,保留1048576K

打开VisualVM,开始监控MemoryLeakDemo在“Monitor”选项卡上,我们可以看到实时的程序内存堆使用情况:

峰谷GC随处可见。可以明显看出GC执行后内存曲线依然呈上升趋势,也就是说内存使用量只增不减。原因是什么?

打开Sampler选项卡并单击Memory按钮启动内存分析会话VisualVM将定期获取所有执行线程的转储,分析堆栈跟踪信息并实时显示堆栈直方图。通过堆栈直方图,我们可以找出哪些对象占用了更多内存,以便进一步优化。

如上,第1行的Integer对象占用内存最大


三、如何排查Java内存泄露Analyzer–是一款开源Java内存分析软件。它可以轻松检测内存泄漏并验证谁占用了它。它基于EclipseRCP(RichClientPlatform)或EclipseRCP或Eclipse插件。
-分析Java内存泄漏。
ler-一个全功能的Java分析工具,专用于分析J2SE和J2EE应用程序。它将CPU、线程和内存分析结合到一个强大的应用程序中。GUI可以发现性能瓶颈、捕获内存泄漏并解决线程问题。
t–用于诊断Java内存泄漏并查明根本原因。它专门针对Intel平台进行了优化,可以在Intel硬件上实现最高性能。
&JavaProfiling是业界领先的Java和.NET程序性能分析工具。
tedQA-AutomatedQA屡获殊荣的性能分析和内存调试工具集的下一代替代产品,支持Microsoft、Borland、Intel、Compaq和GNU编译器。可以为.NET和Windows程序生成广泛而详细的报告,帮助您轻松隔离和解决代码中的性能问题和内存/资源泄漏问题。支持.Net1.0、1.1、2.0、3.0和Windows32/64位应用程序。
areDevPartnerJavaEdition–包含Java内存检测、代码覆盖率测试、代码性能测试、线程死锁、分布式应用程序等许多功能模块。