java 用于增加堆大小的 Xms 命令无法正常工作
java Xms command for increasing heap size not working correctly
Ubuntu 托管一些 WAr 应用程序的服务器收到如下几个堆错误消息。此服务器 运行s 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 并这样设置。我检查了这个 post 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 的文章,但是如果我 vim 该命令我没有得到任何可以编辑堆大小或 Xms 的部分所以问题是:
另请阅读 this,但我不想为任何 jar 设置此设置,想为服务器上的所有 war 应用程序设置此设置。
所以在阅读了这么多 post 和答案之后,并且没有 java 中的最佳知识,最好的方法是什么?正确的命令是怎样的?在这个命令是 运行 之后,最大堆大小配置好了吗?
我也知道在代码方面,开发人员也需要检查他们的部分,因为我还读到这个问题不仅来自 hardware 和 java 配置。
谢谢!
好的,您正在尝试的 java 命令没有设置一些全局值或类似的东西。这就是您在 运行 特定程序时指定初始堆和最大堆的方式,错误消息告诉您,'我不知道您要我做什么 运行。请告诉我在哪里可以找到我的主要方法'。
这也不是 ubuntu 问题。这确实是一个 Tomcat 问题。您将需要更新 Tomcat 配置。您需要告诉 Tomcat 以您需要的内存量启动您的程序。请查看 Tomcat 文档(或者也许其他人会告诉您如何操作,但我已经 运行 Tomcat 多年了)。
就其价值而言,您可能需要让程序员参与进来。您没有说您的程序正在尝试做什么,但需要超过 1 个演出可能是系统性的不同问题。可能只是您正在处理相当大的数据,但 运行经常内存不足是一个编程错误
与其尝试将值全局设置为 jvm,不如将 xmx 和 xms 值分配给进程,以便它采用您指定的值
java -Xms64m -Xmx2048m -jar {your application name }
与其使用您当前正在使用的上述命令,我建议您执行以下操作
java -jar -Xms64m -Xmx2048m {your application name }
此处最小最大堆大小将设置为您的进程本身。
要验证指定的值是否已更新,您可以使用以下命令。
您可以使用 jps
命令列出当前所有 运行 processes.then 选择与您的应用程序相关的进程的 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 和 2Gb)。检查它们是否符合你在 运行 我推荐的命令后设置的值。
如果是这样你们都很好
Ubuntu 托管一些 WAr 应用程序的服务器收到如下几个堆错误消息。此服务器 运行s 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 并这样设置。我检查了这个 post 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 的文章,但是如果我 vim 该命令我没有得到任何可以编辑堆大小或 Xms 的部分所以问题是:
另请阅读 this,但我不想为任何 jar 设置此设置,想为服务器上的所有 war 应用程序设置此设置。
所以在阅读了这么多 post 和答案之后,并且没有 java 中的最佳知识,最好的方法是什么?正确的命令是怎样的?在这个命令是 运行 之后,最大堆大小配置好了吗? 我也知道在代码方面,开发人员也需要检查他们的部分,因为我还读到这个问题不仅来自 hardware 和 java 配置。 谢谢!
好的,您正在尝试的 java 命令没有设置一些全局值或类似的东西。这就是您在 运行 特定程序时指定初始堆和最大堆的方式,错误消息告诉您,'我不知道您要我做什么 运行。请告诉我在哪里可以找到我的主要方法'。
这也不是 ubuntu 问题。这确实是一个 Tomcat 问题。您将需要更新 Tomcat 配置。您需要告诉 Tomcat 以您需要的内存量启动您的程序。请查看 Tomcat 文档(或者也许其他人会告诉您如何操作,但我已经 运行 Tomcat 多年了)。
就其价值而言,您可能需要让程序员参与进来。您没有说您的程序正在尝试做什么,但需要超过 1 个演出可能是系统性的不同问题。可能只是您正在处理相当大的数据,但 运行经常内存不足是一个编程错误
与其尝试将值全局设置为 jvm,不如将 xmx 和 xms 值分配给进程,以便它采用您指定的值
java -Xms64m -Xmx2048m -jar {your application name }
与其使用您当前正在使用的上述命令,我建议您执行以下操作
java -jar -Xms64m -Xmx2048m {your application name }
此处最小最大堆大小将设置为您的进程本身。
要验证指定的值是否已更新,您可以使用以下命令。
您可以使用 jps
命令列出当前所有 运行 processes.then 选择与您的应用程序相关的进程的 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 和 2Gb)。检查它们是否符合你在 运行 我推荐的命令后设置的值。
如果是这样你们都很好