0

托管一些 WAR 应用程序的 Ubuntu Server 收到一些堆错误消息,如下所示。该服务器运行 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 max heap size 非常相关的内容。所以我运行以下命令并检查我有 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 并像这样设置它。我在这里查看了这篇文章,正在谈论执行 So 的命令,但是当我在控制台上运行它时,我无法这样做。这是命令:

 java -Xms64m -Xmx2048m

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

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

也阅读这个答案,但不是很清楚

我也读过关于 catalina.sh 的编辑,但是如果我 vim 该命令,我没有得到可以编辑堆大小或 Xms 的任何部分,所以问题是:

另请阅读内容,但我不想为任何 jar 设置此内容,希望为服务器上的所有战争应用程序执行此操作。

那么在阅读了这么多帖子和答案之后,并且没有最好的java知识,最好的方法是如何做到这一点?正确的命令如何?运行此命令后,最大堆大小是否配置好?我也知道在代码方面,开发人员也需要检查他们的部分,因为我还读到这个问题不仅来自硬件和 java 配置。谢谢!

4

2 回答 2

1

而不是尝试将值全局设置给 jvm 将 xmlx 和 xms 值分配给进程,以便它采用您指定的值

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

而不是使用您当前使用的上述命令,我建议您在下面执行

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

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

要验证指定的值是否已更新,您可以使用以下命令。

您可以使用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)。检查它们是否与您在运行我推荐的命令后设置的值相符。

如果是这样,你们都很好。

于 2019-10-04T07:05:38.097 回答
0

好的,您尝试的 java 命令没有设置一些全局值或类似的东西。这就是你在运行特定程序时指定初始堆和最大堆的方式,错误消息告诉你,'我不知道你想让我运行什么。请告诉我在哪里可以找到我的主要方法'。

这也不是 ubuntu 问题。这确实是Tomcat的问题。您将需要更新 Tomcat 配置。你需要告诉 Tomcat 以你需要的内存量来启动你的程序。请查看 Tomcat 文档(或者也许其他人会告诉您如何操作,但我已经多年没有运行 Tomcat)。

对于它的价值,您可能需要让程序员参与其中。你没有说你的程序试图做什么,但需要超过 1 个演出可能是系统性的不同问题。可能只是您正在处理大数据,但经常耗尽内存是一个编程错误

于 2018-11-26T21:18:26.067 回答