Java 分析web应用程序的线程转储

Java 分析web应用程序的线程转储,java,multithreading,tomcat,quartz-scheduler,Java,Multithreading,Tomcat,Quartz Scheduler,您好,我已经为我的web应用程序进行了线程转储,该应用程序正在使用JSTACK一次又一次地耗尽内存,但我有点困惑,如何找到正确的罪犯线程有人能给出如何分析转储文件的提示。使用JDK附带的VisualVM。当您出现OutOfMemoryError时,第一步是读取相关的消息。它解释了错误的原因:堆、perm、线程 根据原因,您必须检查空间的配置:堆为-Xms和-Xmx,perm Java 7为-XX:PermSize和-XX:MaxPermSize,metaspace Java 8为-XX:MaxM

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

使用JDK附带的VisualVM。

当您出现OutOfMemoryError时,第一步是读取相关的消息。它解释了错误的原因:堆、perm、线程

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

之后,使用工具了解内存是如何消耗的。VisualVM很棒,它提供了内存的度量,帮助您进行堆转储或分析非生产内存。您可以在启动脚本中添加-XX:+heapdumponotofmemoryError选项,以便在运行OutOfMemoryError时自动生成堆转储


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

堆转储对于内存不足错误更有意义。如果由于线程原因导致内存不足,即收到消息无法创建本机线程,如何在windows Server的生产环境中进行此堆转储你能建议我如何前进吗?我想你是在32位操作系统上。根据操作系统的不同,进程的大小有2到3或4 GB的限制。每个线程使用一个由-Xss设置的内存量。当应用程序启动新线程并达到限制时,将抛出OutOfMemoryError。你好像在这个案子里。解决方案:1移动到64位操作系统;2减小Xss值try-Xss256k或-Xss128k;3减小-Xms和/或-XX:MaxPermSize值。谢谢您的回答,但我使用的是64位而不是32位操作系统。事实上,我将应用程序从旧服务器移动到了一个全新的服务器。之后,问题开始可能与窗口作业调度程序有关。顺便说一句,这是一个使用quartz调度作业的独立程序。确定。然后,您应该检查VM中的线程数。您可能已经达到了这一侧的系统限制。