【问题标题】:Understand Heap-dump and Thread-dump for Large-scale application了解大规模应用的堆转储和线程转储
【发布时间】:2020-05-12 12:02:24
【问题描述】:

我在 Youtube 和 Pluralsight 上浏览了一些 Java Profiler 教程(JVisualVM、JProfiler、YourKit)。我对如何检查堆转储以及如何查找内存泄漏有了一些了解。但是这些所有教程都是初级的。

我的查询是,当我在堆转储中进行分析时,我只看到了 3 种类型的对象 char[], java.lang.String and java.lang.Object[],它们几乎覆盖了所有内存(总是超过 70%)。但我的申请中没有。 与线程转储的方式相同,我看到了 HTTP-8080 请求(我正在使用的端口),这将我引导至 Runnable()'s run method or Java Concurrent Package 并且再次没有指向我的项目的任何特定代码。

我也和一些朋友讨论了这个问题,也分析了他们的应用程序(没有遇到内存泄漏和性能方面的任何问题),但他们的结果几乎是一样的。

你们能否帮助了解如何在 JVisualVM 中为大型应用程序分析堆转储和线程转储?任何视频、博客、任何东西都会有所帮助。

我使用 OpenJDK-11、AWS ECS-Docker 和 Tomcat 作为网络服务器。

【问题讨论】:

  • 字符串占据堆内存的很大一部分是正常的。教程应该已经向您展示了如何识别引用这些字符串的对象。

标签: java-11 heap-dump jvisualvm thread-dump


【解决方案1】:

查看Eclipse Memory Analyzer (https://www.eclipse.org/mat/),我之前用过几次都成功找到了内存泄漏,但是需要一些时间来熟悉它。

我可以给您的另一个建议是使用 Apache JMeter (https://jmeter.apache.org/) 或其他工具创建基准测试,让您重现性能/内存问题并确定导致问题的执行路径。

请注意 AWS 不喜欢有人对其服务执行性能/渗透测试 (https://aws.amazon.com/aup/)

【讨论】:

    猜你喜欢
    • 2011-10-09
    • 2010-11-20
    • 2016-10-07
    • 2013-01-05
    • 1970-01-01
    • 1970-01-01
    • 2012-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多