Java 如何调试webapp中的OutOfMemoryException

Java 如何调试webapp中的OutOfMemoryException,java,performance,spring,jakarta-ee,out-of-memory,Java,Performance,Spring,Jakarta Ee,Out Of Memory,我正在尝试调试内存不足错误。当我使用Jmap进行堆转储并使用EclipseMat分析结果时,我看到了以下内容 7,677 instances of "java.lang.Class", loaded by "<system class loader>" occupy 48,094,720 (23.99%) bytes. BlahService是一个带有@service注释的spring服务。所有的服务类在春天都是单例的——每个IOC每个bean一个——那么为什么这个类会成为头号

我正在尝试调试内存不足错误。当我使用Jmap进行堆转储并使用EclipseMat分析结果时,我看到了以下内容

7,677 instances of "java.lang.Class", loaded by 
"<system class loader>" occupy 48,094,720 (23.99%) bytes. 
BlahService是一个带有@service注释的spring服务。所有的服务类在春天都是单例的——每个IOC每个bean一个——那么为什么这个类会成为头号嫌疑犯呢

我也看到了

One instance of "org.apache.jasper.servlet.JspServlet" loaded by 
"org.apache.catalina.loader.StandardClassLoader @ 0x2aaac17bc260" occupies 42,724,168 
(21.31%) bytes. The memory is accumulated in one instance of 
"java.util.concurrent.ConcurrentHashMap$Segment[]" loaded by "<system class loader>".
加载的“org.apache.jasper.servlet.JspServlet”的一个实例
“org.apache.catalina.loader.StandardClassLoader@0x2aac17bc260”占据42724168
(21.31%)字节。内存累积在一个实例中
“java.util.concurrent.ConcurrentHashMap$段[]”由“”加载。

这意味着什么?

是的,当做一些事情来修复它为时已晚时,这个错误就会出现,因为一旦堆被填满,JVM就不能做任何事情,因为它不能创建对象来做一些事情,换句话说,因为你在使用Spring,我猜你在做一个Web系统,在这种情况下,您需要做的就是在deploy命令的开头提供更多的堆空间(类似于“-Xms:256”),并计划好应用程序将需要多少资源,因为这是一个事实,如果内存被填满,系统将崩溃。

OutOfMemoryError通常表示以下两个问题之一: 1.要么是内存太少,无法满足应用程序的需要。然后需要使用Xmx启动参数增加服务器的堆大小
2.或者您的应用程序或它使用的某个第三方库中存在内存泄漏。在没有经验的情况下,跟踪内存泄漏并非易事。我可以推荐。这是一个非常容易使用且精确的工具,用于监控内存泄漏。

我使用过java Profiler,但我对当前切换到的实际性能调整和内存使用的输出不满意。这不仅有助于开发人员优化性能,而且有助于生产系统优化性能。Java melody非常易于集成和配置,在生产环境中,您只需更新web.xml即可启用或禁用它,您只能显示占用少于100 MiB内存的对象。这对于Tomcat应用程序来说并不多。难道你看不到其他需要内存的对象吗?也许您应该增加堆大小(
-mx
),默认值对于Tomcat/Spring来说太低了。您是说OutOfMemoryError吗?Java API中不存在OutOfMemoryException。这不是一个例外,而是一个错误,我认为你无法从中恢复。
One instance of "org.apache.jasper.servlet.JspServlet" loaded by 
"org.apache.catalina.loader.StandardClassLoader @ 0x2aaac17bc260" occupies 42,724,168 
(21.31%) bytes. The memory is accumulated in one instance of 
"java.util.concurrent.ConcurrentHashMap$Segment[]" loaded by "<system class loader>".