【问题标题】:OutOfMemoryError on OpenShiftOpenShift 上的 OutOfMemoryError
【发布时间】:2014-06-11 20:40:22
【问题描述】:

我有一个在 OpenShift(1 个小齿轮)上运行的 Tomcat Java 应用程序,它由两个主要部分组成:每分钟运行一次的 cron 作业,解析来自网络的信息并将其保存到 MongoDB 数据库中,以及一些要访问的 servlet那个数据。 部署应用程序后,它运行良好,但迟早服务器会停止,我无法再访问 servlet(HTTP 请求需要很长时间,如果完成,它会返回 Proxy Error)。我只能使用rhc 命令行强制停止应用并重新启动它。

当我查看jbossews.log 文件时,我看到多次出现此错误:

Exception in thread "http-bio-127.5.35.129-8080-Acceptor-0" java.lang.OutOfMemoryError:
unable to create new native thread

我可以做些什么来防止此错误,而无需升级到具有更多内存的更大齿轮?

【问题讨论】:

  • 通过向服务器添加 VM 参数来增加堆内存的大小
  • @NiravPrajapati 我需要在哪里为 OpenShift 项目设置这些 VM 参数?在catalina.properties文件中?

标签: java tomcat openshift


【解决方案1】:

根据您的描述,我可以理解您的应用程序存在一些内存泄漏问题。那可能是因为你没有弯腰。

有时候线程不会自动停止,那么我们需要明确地停止线程。

【讨论】:

  • 我没有在应用程序中创建任何额外的线程。我只有 HttpServlets 和 cron 作业(运行 wget 以启动其中一个 servlet)
  • 我想我找到了问题,请参阅我对下面其他答案的评论。
【解决方案2】:

我猜,这不是内存问题,而是操作系统资源问题。您的本机线程已用完,这是您的 JVM 可以拥有的最大线程数。

你可以通过这种方式增加它

ulimit -s newvalue

【讨论】:

  • 当我在 Openshift 服务器上(通过 SSH)只输入 ulimit 时,它会返回 unlimited,所以这应该不是问题。
  • 同样在运行 ulimit -s unlimited 之后,问题依然存在。
  • 如果你不能增加它,那么它只剩下检查代码以找出它为什么创建许多线程的选项。
  • 啊,我在代码中发现了错误。在打开 MongoDB 数据库后,它并没有关闭它们的连接,因此生成了许多线程。我改变了它,它现在似乎运行良好。
  • 嗯。这似乎只是问题的一部分。现在需要更长的时间,但一段时间后它仍然停止工作。稍后我会再次检查代码。
猜你喜欢
  • 2015-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-28
  • 1970-01-01
  • 2019-05-08
  • 2014-11-28
相关资源
最近更新 更多