当前位置: 首页 > 面试题库 >

如何找到Java内存泄漏

卢文博
2023-03-14
问题内容

您如何找到Java中的内存泄漏(例如使用JHat)?我试图在JHat中加载堆转储,以进行基本了解。但是,我不明白我应该如何找到根引用(ref)或任何被称为根引用的东西。基本上,我可以说哈希表条目有几百兆字节([java.util.HashMap $ Entry或类似的东西),但是地图到处都是……使用某种方法可以搜索大型地图,还是找到大对象树的一般根?

[编辑]好的,到目前为止,我已经阅读了答案,但是我们只能说我是个贱人(这意味着我对学习如何使用JHat而不是为JProfiler付费更感兴趣)。另外,由于JHat是JDK的一部分,因此始终可用。除非当然不能使用JHat,否则只能使用蛮力,但我不敢相信这种情况。

另外,我认为我将无法进行实际修改(添加所有地图尺寸的记录)并运行足够长的时间,以至于我无法注意到泄漏。


问题答案:

我使用以下方法来查找Java中的内存泄漏。我使用jProfiler取得了巨大的成功,但是我相信任何具有图形功能的专业工具(差异更容易以图形形式进行分析)都可以使用。

  1. 当所有初始化完成且应用程序处于空闲状态时,启动应用程序并等待其进入“稳定”状态。
  2. 多次运行怀疑会导致内存泄漏的操作,以允许发生任何与数据库相关的高速缓存。
  3. 运行GC并获取内存快照。
  4. 再次运行该操作。根据操作的复杂性和已处理数据的大小,可能需要运行几次到很多次。
  5. 运行GC并获取内存快照。
  6. 对2个快照运行差异并进行分析。
    基本上,分析应该从最大的正差异开始,例如,对象类型,并找出导致这些额外对象滞留在内存中的原因。

对于在多个线程中处理请求的Web应用程序,分析变得更加复杂,但是仍然可以使用常规方法。

我做了很多专为减少应用程序的内存占用量的项目,并且这种通过一些特定于应用程序的调整和技巧的通用方法始终可以很好地工作。



 类似资料:
  • 我有一个后台服务正在运行,它正在将数据同步到我的服务器。 泄漏发生在以下代码中: 内存分析器显示: stockserv.datasyncer.jobexecutor@0x135f6550上的线程保留了总大小为18.603.056(37,90%)字节的局部变量。内存累积在“”加载的“java.lang.Object[]”的一个实例中。 JobExecutor->Arraylist->Object[2

  • 问题内容: 我怀疑我们的ActiveMQ连接桥中存在严重的内存泄漏- 我们看到的是典型的内存泄漏模式(应用程序加载正常,如果长时间运行或在短时间内一次又一次地重新启动,则会降低速度) 。我查找了发现Java内存泄漏的现代最佳实践,许多开发人员似乎正在放弃传统工具(如jhat / jmap)来代替new(er)。 启动此工具(并花几个小时阅读其教程)后,我便能够为CPU和内存拍摄探查器快照。 在这一

  • 我需要找到Flutter的内存泄漏。如何找到他们?以及如何为测试创建内存泄漏?

  • 本文向大家介绍Java 内存泄漏,包括了Java 内存泄漏的使用技巧和注意事项,需要的朋友参考一下 在Java中,垃圾回收(析构函数的工作)是使用垃圾回收自动完成的。但是,如果代码中有引用它们的对象怎么办?它无法取消分配,即无法清除其内存。如果这种情况一再发生,并且创建或引用的对象根本没有被使用,它们就会变得无用。这就是所谓的内存泄漏。 如果超过了内存限制,则程序将通过抛出错误(即“ OutOfM

  • 我们有一个使用eclipse-jetty版本8.1.6的java webserver。最近我们开始注意到内存不足的错误。我们对活动线程数的分析很少。这似乎在100左右是合理的。该进程具有5GB最大堆内存和4GB初始堆内存。 webserver平均每分钟接收350个请求。此外,我们在ELB(kubernetes服务)后面运行许多这样的实例。跑了几个小时后,我们注意到了这个OOM。这个问题是随机的,它

  • 我用java写了一个项目,使用JNI使用C++库。所有的代码都是我们写的,所以我有所有的源代码。 几个小时后,机器内存耗尽,尽管我的进程只是迭代文件,并且删除了与上一个文件有关的所有内存。 谢了。