Команда Java XMS для увеличения размера кучи не работает правильно
Ubuntu Server, на котором размещены некоторые приложения WAr, получает несколько сообщений об ошибках, как показано ниже. Этот сервер работает на 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 (основные вещи). Сначала я подумал, что это связано с оперативной памятью (4 ГБ на сервере), но потом я прочитал во многих местах, что в значительной степени связано с максимальным размером кучи Java. Поэтому я запустил следующую команду и проверил, что у меня есть 65 МБ для начального размера и 1 ГБ для максимального.
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 ГБ и установить его таким образом. Я проверил этот пост здесь и говорю о команде сделать так, но когда я запускаю ее на консоли, я не могу это сделать. Вот команда:
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, поэтому вопрос будет:
Также прочитайте это, но я не хочу устанавливать это для любой банки, хочу сделать это для всех военных приложений на сервере.
Итак, прочитав так много постов и ответов и не обладая лучшими знаниями в Java, как лучше всего это сделать? Как правильная команда? после запуска этой команды максимальный размер кучи настроен на хорошее? Я также знаю, что на стороне кода разработчики также должны проверить свою часть, так как я также прочитал, что эта проблема не только в аппаратной конфигурации и конфигурации Java. Спасибо!
1 ответ
Хорошо, команда java, которую вы пытаетесь установить, не устанавливает глобальное значение или что-то в этом роде. Именно так вы указали бы начальную и максимальную кучу при запуске определенной программы, и сообщение об ошибке говорит вам: "Я не знаю, что вы хотите, чтобы я запустил. Пожалуйста, скажите мне, где найти мой основной метод ".
Это не проблема убунту. Это действительно проблема Tomcat. Вам нужно будет обновить конфигурацию Tomcat. Вы должны указать Tomcat запустить вашу программу с необходимым вам объемом памяти. Пожалуйста, ознакомьтесь с документацией Tomcat (или, может быть, кто-то еще скажет вам, как, но я не запускал Tomcat годами).
Что бы это ни стоило, вам может понадобиться участие программиста. Вы не говорите, что пытается сделать ваша программа, но необходимость в более чем 1 гигабайте может быть системной проблемой. Это может быть просто работа с большими данными, но нехватка памяти очень часто является ошибкой программирования
Вместо того, чтобы пытаться установить значения глобально для jvm, назначьте значения xmx и 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)(в моем случае это было 4 ГБ и 8 ГБ - у вас должно быть 64 МБ и 2 ГБ). проверьте, совпадают ли они со значениями u, установленными после выполнения рекомендованной мной команды.
если да, то у вас все хорошо.