Java 在Apache服务器上运行.jar,但内存不足错误

Java 在Apache服务器上运行.jar,但内存不足错误,java,spring,apache,memory,jar,Java,Spring,Apache,Memory,Jar,我想在Apache服务器上运行.jar。(我的主机提供cPanel支持等…) 当我尝试使用以下工具运行它时: java -jar "JAR_FILE_PATH" 过了一会儿,我发现了错误: java.lang.OutOfMemoryError:无法创建新的本机线程 我还尝试使用-Xmx16m-Xmx2G运行,但我得到了相同的错误 也许有一些CMD我可以配置默认值,但我仍然是noob,这是第一次…:) 有人知道吗?OutOfMemoryError:无法创建新的本机线程表示您没有足够的本机内存来

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

当我尝试使用以下工具运行它时:

java -jar "JAR_FILE_PATH"
过了一会儿,我发现了错误:

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

我还尝试使用
-Xmx16m-Xmx2G
运行,但我得到了相同的错误

也许有一些CMD我可以配置默认值,但我仍然是noob,这是第一次…:)


有人知道吗?

OutOfMemoryError:无法创建新的本机线程表示您没有足够的本机内存来生成线程。注意,它与堆空间完全不同

出现该错误的最典型情况是堆栈空间、地址空间或
最大用户进程数不足。几乎所有的情况都与创建太多线程有关

  • Linux上的
    堆栈空间
    可以通过
    ulimit-s
    进行检查。每个Java线程消耗一定数量的堆栈大小。它可以通过
    -Xss
    -XX:ThreadStackSize=…
    进行配置 您可以通过
    java-XX:+printflasfinal-version | grep ThreadStackSize
    检查平台的默认堆栈大小。您可以通过减少
    ThreadStackSize
    压缩更多线程,代价是
    StackOverflowError
    ,以防您的应用程序确实需要深度堆栈
  • 地址空间
    是使用32位JVM时的一个问题。根据您的屏幕截图,您使用的是32位JVM,因此您的总地址空间受限于4G。这包括所有内容(堆、非堆、堆栈、本机内存等)。也就是说,为堆(-Xmx)分配的线程越多,可以创建的线程就越少。 解决方法是使用64位JVM,或者减少堆大小,等等
  • Linux上的最大用户进程可以通过
    ulimit-u
    进行监控。若您有1000个进程的“默认”限制,那个么您可以很容易地达到这个限制,因为每个线程都朝着这个限制AFAIK计数。解决办法是增加限制

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

    “我想在Apache服务器上运行.jar”-请解释。是一个HTTP服务器。运行
    .jar
    和它有什么关系?好的,这是我曾经开发过的BE应用程序。当然,它有一个基于角4的FE边。据我所知,理论上它可以在Apache上运行。或者它是假的?这并没有增加任何澄清。Apache通过HTTP提供文件服务-它还可以通过插件(PHP、CGI等)运行。您的
    .jar
    做什么?它如何适应?如果问题是如何在同样运行Apache的服务器上运行
    .jar
    ,那么Apache部分肯定是不相关的……您很可能有错误的代码。连接视觉指示器,以查看线程正在执行的操作。@Boristespider这很可能是一只Tomcat。