用于增加堆大小的Java Xms命令无法正常运行

时间:2018-11-26 20:20:29

标签: java ubuntu heap-size

托管一些WAr应用程序的Ubuntu服务器正在获得一些如下的堆错误信息。该服务器运行tomcat8并运行良好,现在并且在代码端服务器上未进行任何更改就出现了错误,Tomcat停止了。

    EVERE: SEVERE:Memory usage is low, parachute is non existent, your 
    system may start failing.
Exception: java.lang.OutOfMemoryError thrown from the 
UncaughtExceptionHandler in thread "Thread-21"
Exception: java.lang.OutOfMemoryError thrown from the 
UncaughtExceptionHandler in thread "Thread-9"
Exception: java.lang.OutOfMemoryError thrown from the 
UncaughtExceptionHandler in thread "Thread-17"
SEVERE:Memory usage is low, parachute is non existent, your system may start 
failing.
Exception in thread "Thread-11" java.lang.OutOfMemoryError: Java heap space
Exception in thread "http-nio-8080-Acceptor-0" Exception in thread 
"ContainerBackgroundProcessor[StandardEngine[Catalina]]" Exception in thr 
09:39:19.841 ERROR 116336 --- [nio-8080-exec-5] 
o.s.b.w.servlet.support.ErrorPageFilter  : Forwarding to error page from 
request [/teams/my
java.lang.OutOfMemoryError: Java heap space
SEVERE:Memory usage is low, parachute is non existent, your system may start 
failing.
java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space

我不是开发人员,所以我不太了解Java(基本知识)。起初我虽然认为它与ram内存(服务器上的4gb)有关,但是后来我在很多地方读到了与Java最大堆大小有关的内容。 因此,我运行以下命令,并检查我有65 MB的初始大小和1 GB的最大大小。

java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'
 intx CompilerThreadStackSize                   = 0                                   {pd product}
uintx ErgoHeapSizeLimit                         = 0                                   {product}
uintx HeapSizePerGCThread                       = 87241520                            {product}
uintx InitialHeapSize                          := 65011712                            {product}
uintx LargePageHeapSizeThreshold                = 134217728                           {product}
uintx MaxHeapSize                              := 1031798784                          {product}
 intx ThreadStackSize                           = 1024                                {pd product}
 intx VMThreadStackSize                         = 1024                                {pd product}

现在,我想将最大大小增加到2 GB并像这样进行设置。我签入了这篇文章here,并在谈论这样做的命令,但是当我在控制台上运行它时,我无法这样做。这是命令:

 java -Xms64m -Xmx2048m

我明白了,就像命令语法不正确

Usage: java [-options] class [args...]
       (to execute a class)
   or  java [-options] -jar jarfile [args...]
       (to execute a jar file)

还阅读了this的答案,但不太清楚

我也阅读了catalina.sh的编辑内容,但是如果我执行该命令,那么我将无法编辑堆大小或Xms,因此问题将是:

也请阅读this,但我不想为任何jar设置此项,而是想对服务器上的所有war应用程序都这样做。

因此,在阅读了如此多的帖子和答案之后,并且由于没有对Java的最好的了解,如何才能做到这一点?正确的命令如何?运行此命令后,最大堆大小配置是否正确? 我也知道,在代码方面,开发人员还需要检查自己的角色,因为我还读到,这个问题不仅来自硬件和Java配置。 谢谢!

2 个答案:

答案 0 :(得分:0)

好吧,您尝试使用的java命令没有设置某些全局值或类似的值。这是您在运行特定程序时指定初始堆和最大堆的方式,并且错误消息告诉您:“我不知道您要我运行什么。请告诉我在哪里可以找到我的主要方法。

这也不是Ubuntu问题。这确实是Tomcat问题。您将需要更新Tomcat配置。您需要告诉Tomcat使用所需的内存量来启动程序。请查阅Tomcat文档(或者也许其他人会告诉您如何使用,但是多年以来我都没有运行过Tomcat)。

对于它的价值,您可能需要让程序员参与。您没有说程序要做什么,但是需要超过1 gig可能是另一个问题的系统原因。可能只是您正在处理一些大数据,但内存不足经常是编程错误

答案 1 :(得分:0)

不是尝试将全局值设置为jvm,而是将xmx和xms值分配给进程,以使其采用您指定的值

java -Xms64m -Xmx2048m -jar {your application name }

我建议您在下面执行

,而不要使用当前正在使用的上述命令
 java -jar -Xms64m -Xmx2048m {your application name }

在这里,最小最大堆大小将设置为您的进程本身。

要验证指定值是否已更新,可以使用下面的cammands。

您可以使用jps命令列出当前正在运行的所有进程,然后选择与您的应用程序相关的进程的pid。

将以下命令与您收到的应用程序的pid一起使用

jcmd {pid} VM.flags

这将给您这样的答复

-XX:CICompilerCount=4 -XX:InitialHeapSize=4345298944 -XX:MaxHeapSize=8388608000 -XX:MaxNewSize=2796027904 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=1448083456 -XX:OldSize=2897215488 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseParallelGC 

在这里您可以看到初始堆大小(Xms)和mac堆大小(Xmx)(在我的情况下是4Gb和8Gb,您应该分别是64mb和2 Gb)。在运行我推荐的命令后,检查它们是否与您设置的值相符。

如果一切都很好,那么