【问题标题】:How to measure memory leak in Storm topology using visualvm?如何使用 visualvm 测量 Storm 拓扑中的内存泄漏?
【发布时间】:2016-04-08 16:33:30
【问题描述】:

我是 Java 和 Storm“三叉戟”的新手。我在本地模式下运行拓扑时遇到了这个错误:

OutOfMemoryError: GC overhead limit exceeded
worker died

我安装了虚拟机程序但不知道怎么用?

我应该在运行拓扑的过程中运行程序吗?

我尝试通过以下方式增加工作人员的内存:

 worker.childopts: "-Xmx4048m -XX:MaxPermSize=256m -XX:+PrintGCDetails
-XX:+PrintGCTimeStamps -verbose:gc -Xloggc:/usr/local/storm/logs/gc-storm-
 worker-%6700%.log"

我在代码中使用了 3 个HashMaps,有什么问题吗?

【问题讨论】:

    标签: java memory-leaks garbage-collection apache-storm


    【解决方案1】:

    -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/logdir 添加到您的 JVM 参数中。然后,在发生 OOM 事件后分析生成的.hprof 文件。

    【讨论】:

    • 感谢您的帮助,但请问我在哪里可以添加这一行 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/logdir ?什么是OOM?
    • OOM - OutOfMemoryError,以及您添加到启动 java 应用程序部分的 -XX 选项。您可以通过查找具有例如的文件来找到放置这些文件的位置。 -Xmx4048m 在里面
    • @krzyk 感谢您的帮助,但请问我在哪里可以添加此行?我使用 mvn 命令运行项目,例如 mvn compile exec:java -Dexec.classpathScope=compile -Dexec.mainClass=trident.FCS 你的意思是把它写在这个命令中还是在哪里?提前致谢
    • 您需要将-Dexec.args="-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/logdir" 添加到您的命令中
    • @krzyk 我现在正在运行代码并打开可视虚拟机,我在帖子中编辑了我到目前为止所得到的屏幕截图,程序仍在运行,几个小时后会抛出这个错误,我应该在我的命令或程序中添加上面的行会做吗?非常感谢您的宝贵时间,请问我在哪里可以找到 hprof 文件?
    【解决方案2】:

    1) 尝试限制拓扑中的元组。如果运行基本拓扑,则将topology.max.spout.pending 设置为 1000,如果运行 trident 拓扑,则设置为 100。

    2) 检查您的代码。您写道,该拓扑包含三个HashMap。你如何使用它们?也许您插入对象,但不删除它们,或者插入比删除快得多?

    【讨论】:

    • 谢谢,我认为第二点是问题所在,我没有删除它们,只是我想计算推文中的单词数,所以我将它们存储在 hashmap 中,然后在我的方程中使用它们,应该在哪里我删除它们?
    • 你的 Bolt 执行方法的 Post 代码,以及 spouts 的 nextTuple。
    • 感谢您的回复。我正在使用 Trident,它不包含喷口或螺栓。
    猜你喜欢
    • 1970-01-01
    • 2013-03-04
    • 2012-02-27
    • 2016-12-14
    • 1970-01-01
    • 1970-01-01
    • 2019-05-24
    • 1970-01-01
    • 2023-03-18
    相关资源
    最近更新 更多