OutOfMemoryError 消息或 OOME 是用户在使用 Tomcat 时遇到的最常见问题之一。这些消息可能由多种因素引起,并且它们会严重影响应用程序性能,因此最好尽一切努力在它们发生之前阻止它们。以下是最常见的 OOME 触发情况,以及帮助您在未来避免这些情况的步骤。Tcat 的管理控制台让您深入了解 Tomcat 实例的内存统计信息,让您能够比以往更快地消除内存泄漏并调整服务器。
原因 1 - 内存泄漏
重新启动应用程序时的内存泄漏,这是一个普遍报告的问题,实际上通常可以追溯到 Web 应用程序设计中的缺陷,而不是 Tomcat 的代码库。
这些应用程序很可能会保留对 Web 应用程序类加载器的引用,从而防止垃圾收集进程从永久代或 PermGen 中清除类。
因为 PermGen 的大小有限,重新加载有缺陷的应用程序几次就可以触发 OutOfMemoryError 或 OOME。消除对 Web 应用程序类加载器的保留引用将使垃圾收集正常运行,从而防止这些错误。
Tomcat 7.0 中的内存泄漏保护
对开发人员来说幸运的是, 将于 2010 年夏季发布的Tomcat 7具有许多内存泄漏修复和解决方法,并且这些也已追溯移植到 Tomcat 6.0.x。遇到内存泄漏问题的开发者应考虑尽快升级到最新版本的Tomcat。
原因 2 - 硬件问题
OOME 消息意味着一件简单的事情 - 您没有足够的内存来完成操作。如果您的服务器运行的 RAM 少于 128MB,那么解决问题的唯一真正方法就是升级您的系统。任何其他解决方案充其量只是一个临时补丁。
原因 3 - 大量频繁重新编译的 JSP
如果您的应用程序包含大量具有“经常重新编译”的对象(例如动态头文件)的 JSP,您应该考虑查看 JSP 编译器的配置。可以采取许多步骤来防止这些页面的内存泄漏,这可能会占用您的 RAM。
原因 4 - 操作系统特定的阈值限制
如果您运行的是 *nix 操作系统,您的 OOME 可能是由于文件描述符用完造成的,如果您的阈值设置得太低,就会发生这种情况。您可以通过使用限制来增加每个用户的最大进程数限制来更改阈值,以满足您的应用程序的需求。
另一个可能导致 OOME 消息的特定于操作系统的因素是每个进程的线程限制。您的 JVM 被视为单个进程,因此如果您的操作系统每个进程的线程数默认阈值较低,这可能会导致您的内存问题。大多数操作系统允许增加此阈值,因此请检查您的文档。
原因 5 - 永久代大小不足
尽管您的 PermGen 可能因对类加载器的不正确保留引用而耗尽,但如果您的应用程序只是使用大量 JSP 和 servlet,它也会被填满。默认大小为 64MB,但可以通过使用 -XX:MaxPermSize= 开关来增加。尝试将大小增加一倍或四倍,看看是否可以消除错误消息。
即使您没有收到任何 OOME 消息,正确配置 JVM 的内存分配也是从 Tomcat 获得最佳性能的重要部分。JVM 内存重新分配是一个昂贵的过程,它会占用您想要处理请求的能力。减少它发生的次数会给你一个可靠的性能提升。
步骤 1 - 消除过多的垃圾收集
过多的垃圾收集会给服务器的请求服务能力带来压力。使用 -Xmx 开关以更高的最大堆内存启动 JVM 将降低垃圾收集发生的频率。
此外,如果您不介意降低应用程序的总垃圾收集吞吐量,请考虑使用 -Xincgc 开关来启用增量垃圾收集。
步骤 2 - 正确配置内存重新分配
将这些技术与 -Xms 开关一起使用,该开关将初始堆内存设置为等于最大堆内存,将消除 JVM 调整或重新分配堆内存的任何需要,留下更多内存供其他内存密集型进程使用。
你适合学Java吗?4大专业测评方法
代码逻辑 吸收能力 技术学习能力 综合素质
先测评确定适合在学习