我的问题是,我在 2GB 2Core VPS 上的 Tomcat7 上运行 Web 应用程序,当应用程序因堆溢出异常崩溃时,Tomcat 无法启动或停止。当我尝试通过浏览器访问它时,它只是挂起。
如果我尝试停止它,它看起来会停止,但如果我重复这样做,它应该会抛出异常,因为它已经停止了,但事实并非如此。 15 分钟后我才能再次启动。
我知道我应该解决堆溢出问题,但问题是我根本无法解决,因为我使用的框架结果是点头线程安全的,我必须为每个创建一个内存重对象的新实例请求 :( 我尝试通过添加一些基本 Controller 来解决这个问题,该 Controller 只允许创建一定数量的对象,并且请求的其余部分被重定向到抱歉页面。因为它是针对 UNI 项目和主要目标无法为数百个用户提供服务,因此使框架线程安全并不重要。
我仍然需要知道为什么 Tomcat 在崩溃后会这样做。此外,如果您更好地了解如何限制同时在内存中的这些对象的数量,这也会有所帮助。
++++++++++
目前,我能想到的唯一解决方案是增加 2GB 的 RAM,这样我就可以一次为大约 15-20 个用户提供服务。
请您参考如下方法:
通常,在 tomcat 因内存不足错误而崩溃后,它会处于不可用状态,必须手动或使用以下方式终止该进程
catalina.sh stop -force
有关如何防止内存不足错误的讨论,请参阅 Dealing with "java.lang.OutOfMemoryError: PermGen space" error
尽管最终您可能需要投入更多硬件来解决问题。
这也可能会派上用场: Can I auto restart tomcat jvm on out of memory exception