【问题标题】:Running a .jar on Apache server, but out of memory error在 Apache 服务器上运行 .jar,但内存不足错误
【发布时间】:2017-12-03 11:28:53
【问题描述】:

我想在 Apache 服务器上运行一个 .jar。 (我的主机提供 cPanel 支持等等...)

当我尝试运行它时:

java -jar "JAR_FILE_PATH"

过了一会儿我得到了错误:

java.lang.OutOfMemoryError: 无法创建新的本地线程

我也尝试使用-Xmx16m - Xmx2G 运行,但我得到了同样的错误。

也许有一些我可以配置默认值的 cmds,但我还是菜鸟,这是第一次...:)

有人知道吗?

【问题讨论】:

  • "我想在 Apache 服务器上运行一个 .jar" - 请解释一下。 Apache 是一个 HTTP 服务器。运行.jar 与它有什么关系?
  • 好的,这是我曾经做过的一个 BE 应用程序。当然,它有一个基于 Angular 4 的 FE 方面。据我所知,理论上它可以在 Apache 上运行。还是假的?
  • 这并没有添加任何说明。 Apache 通过 HTTP 提供文件 - 它还可以通过插件运行东西 - PHP、CGI 等。你的 .jar 做什么以及它如何适应?如果问题是我如何在也运行 Apache 的服务器上运行 .jar,那么 Apache 部分肯定是无关紧要的......
  • 你很可能有错误的代码。附上视觉我,看看线程在做什么。
  • @BoristheSpider 这很可能是 Tomcat。

标签: java spring apache memory jar


【解决方案1】:

OutOfMemoryError: unable to create new native thread 表示您没有足够的 native 内存来生成线程。请注意,它与堆空间完全不同。

出现该错误的最典型情况是用完堆栈空间、地址空间或max user processes。几乎所有的情况都与创建过多线程有关。

  1. Linux 上的stack space 可以通过ulimit -s 进行检查。每个 Java 线程都会消耗一定数量的堆栈大小。可以通过-Xss-XX:ThreadStackSize=...进行配置 您可以通过java -XX:+PrintFlagsFinal -version | grep ThreadStackSize 检查您平台的默认堆栈大小。您可以通过减少 ThreadStackSize 来压缩更多线程,代价是 StackOverflowError,以防您的应用程序确实需要深堆栈。
  2. 如果您使用 32 位 JVM,address space 是一个问题。根据您的屏幕截图,您正在使用 32 位 JVM,因此您的总地址空间受限于 4G。这包括所有的东西(堆、非堆、堆栈、本机等内存)。也就是说,您为堆 (-Xmx) 分配的越多,您可以创建的线程就越少。 解决方法是使用 64 位 JVM,或 减少 堆大小等。
  3. Linux 上的max user processes 可以通过ulimit -u 进行监控。如果您有 1000 个进程的“默认”限制,您可以轻松地达到该限制,因为每个线程都计入该限制 AFAIK。解决方案是增加限制。

一般来说,您可能希望添加-XX:+HeapDumpOnOutOfMemoryError、收集堆转储并检查使用的线程数。如果线程数正常(例如小于 100),那么您需要检查配置(上面的 1-3)。如果线程数非常多(例如超过 100 个),您可能希望找到一个缺陷并修复它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-28
    • 1970-01-01
    • 2014-10-04
    • 1970-01-01
    相关资源
    最近更新 更多