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

java内存泄漏分析

  • 内存
  • 2024-06-03 14:58:46
  • 9738

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