【问题标题】:Analyze Thread Dump fow web application分析 Web 应用程序的线程转储
【发布时间】:2015-02-20 16:38:56
【问题描述】:

您好,我已经为我的 Web 应用程序进行了线程转储,该应用程序使用 JSTACK 一次又一次地耗尽内存,但我有点困惑,如何找到正确的罪魁祸首线程可以有人给出如何分析的提示转储文件。

【问题讨论】:

标签: java multithreading tomcat quartz-scheduler


【解决方案1】:

使用 JDK 中包含的 VisualVM。

【讨论】:

    【解决方案2】:

    当您遇到 OutOfMemoryError 时,第一步是读取相关消息。它解释了错误的原因:heap、perm、thread、...

    根据原因,您必须检查空间的配置:-Xms 和 -Xmx 用于堆,-XX:PermSize 和 -XX:MaxPermSize 用于 perm (Java 7-),-XX:MaxMetaspaceSize 用于元空间(Java 8+),...配置可能太低,无法满足您的需要。

    之后,使用工具了解内存是如何消耗的。 VisualVM 很棒,它提供有关内存的指标,帮助您进行堆转储或分析内存(不在生产​​环境中)。您可以在启动脚本中添加 -XX:+HeapDumpOnOutOfMemoryError 选项,以便在运行 OutOfMemoryError 时自动生成堆转储。

    如果您有内存泄漏,我建议使用更高级(而非免费)的分析工具,例如 JProfiler 或 YourKit。

    【讨论】:

    • 如果我因为线程而收到 OutOfMemory,即我收到消息无法创建本机线程,那么您能否建议我如何继续前进。
    • 我猜您使用的是 32 位操作系统。进程的大小限制在 2 到 3 或 4 GB 之间,具体取决于操作系统。每个线程使用一定数量的内存,由 -Xss 设置。当应用程序启动一个新线程并达到限制时,会引发 OutOfMemoryError。你似乎在这种情况下。解决方案: 1) 迁移到 64 位操作系统; 2) 减小 Xss 值(尝试 -Xss256k 或 -Xss128k); 3) 减少 -Xms 和/或 -XX:MaxPermSize 值。
    • 感谢您的回答,但我使用的是 64 位而不是 32 位操作系统,实际上我将我的应用程序从旧服务器移到了一个全新的服务器,之后问题开始可能是与窗口作业调度程序相关的问题.
    • 顺便说一句,它是一个使用石英来安排作业的独立程序。
    • 好的。然后,您应该检查 VM 中的线程数。您可能已达到这一侧的系统限制。
    猜你喜欢
    • 2011-01-17
    • 2016-08-15
    • 1970-01-01
    • 1970-01-01
    • 2011-03-14
    • 2014-04-19
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    相关资源
    最近更新 更多