【问题标题】:Java Memory leak for a old application [closed]旧应用程序的Java内存泄漏[关闭]
【发布时间】:2013-03-19 23:25:13
【问题描述】:

我正在使用的旧 Java 应用程序遇到内存不足异常,是否有任何工具可以帮助我找出应用程序的哪一部分导致内存不足异常?

大多数工具似乎都是为基于 Web 的 Java 应用程序构建的。

我的应用程序不是基于 Web 的应用程序,因此没有创建 WAR 文件和 EAR 文件然后在它们上运行用于内存泄漏的工具的奢侈。

有人知道此类应用程序的工具吗?

【问题讨论】:

  • JVisualVM 是一个非常好的分析工具,并且包含在您的 Java 发行版中。
  • ej-technologies.com/products/jprofiler/overview.html 不错,之前用过,发现了我遇到的问题。不过我可能会先尝试使用 JVisualVM
  • 您的堆栈跟踪是一个很好的起点。您可能只是尝试进行巨大的本地分配,而不是遇到泄漏的保留对象......

标签: java memory-leaks out-of-memory


【解决方案1】:

JDK 中包含的一些基本工具:

  • jps -l :获取 Java 进程的 PID。那么,
  • jmap -histo:live :按类别获取数量和内存使用情况,以便您发现哪个更可能导致您的内存泄漏

您还可以使用嵌入在 JVM 中的分析器 HPROF。非常易于使用,无需更改代码,只需几个命令行选项。有关用法,请参阅documentation。 您可以“手动”阅读 hprof 的日志或使用诸如 HPJmeter(不是 Apache JMeter)之类的工具来绘制漂亮的图表等。任何商业分析器也可以处理 HPROF 的输出。

【讨论】:

    【解决方案2】:

    如果你可以修改 JVM 启动参数,让它在 OutOfMemory 上转储一个堆文件,并使用 Eclipse 的Memory Analysis Tool 分析它。 HotSpot JVM 的参数是-XX:-HeapDumpOnOutOfMemoryError。要指定此文件的位置,请使用-XX:HeapDumpPath=<path_to_save>

    【讨论】:

    • 将 HeapDumpPath 参数添加到您的答案中 - 它变得非常漂亮。
    • 好点,我相信默认是在应用程序运行的目录中放置一个java-<pid>.hprof 文件。
    【解决方案3】:

    您可以尝试的另一个工具是Plumbr。它旨在发现任何基于 java 的应用程序中的内存泄漏。

    【讨论】:

      【解决方案4】:

      yourkit 尽善尽美!试试看!甚至还提供了简单的教程。但你必须购买工具

      【讨论】:

      • 嗯...我可以知道投反对票的原因,以便我能理解我的错误吗?
      猜你喜欢
      • 2014-11-01
      • 1970-01-01
      • 2012-10-20
      • 1970-01-01
      • 2012-11-09
      • 1970-01-01
      • 1970-01-01
      • 2016-11-30
      • 2020-02-14
      相关资源
      最近更新 更多