Java.lang.OutOfMemoryError: пространство кучи Java с ограничением java.exe 300 МБ

У меня есть веб-приложения, которые работают на tomcat5 mysql и используют JVM и java и т.д., он работает нормально, но каждый раз, когда он начинает получать около 300 МБ памяти для java.exe (сервер Windows), он вылетает при выполнении запроса или что-нибудь, что вообще занимает какое-то место в таране. Но у самого сервера машины 16 ГБ оперативной памяти ....

Как это преодолеть?

Я получаю такую ​​ошибку:

ERROR набор результатов Исключение при обработке запроса (4): java.lang.OutOfMemoryError: Java heap space

и если я убью задачу java.exe и перезапущу процесс, он снова будет работать, пока java.exe не достигнет какой-то стены памяти 300 МБ .... Я уже пробовал установить xmx на что-то вроде 1600 МБ или больше, но безрезультатно и вообще не имел никакого значения ....

кто-нибудь знает, что происходит? Java.lang.OutOfMemoryError: пространство кучи Java с ограничением java.exe 300 МБ

Java.lang.OutOfMemoryError: пространство кучи Java с ограничением java.exe 300 МБ

///////////////

ОБНОВЛЕНИЕ С КОММЕНТАРИЯМИ

хорошо, есть что-то странное, что я понял, если я установил его на что-либо на 1024 МБ или ниже, он работает, и службы запускаются в services.msc на сервере Windows всех версий. но если я настрою его на что-то большее, даже на 1025 МБ, он не запустится, ЕСЛИ я не сделаю точные числа, кратные 24, например 1024, 1048, 1072 и т. д., это будет держаться до тех пор, пока не достигнет предела ...

На 32-битном сервере Windows Server 2008 с тоннами памяти, который имеет всего 4 ГБ, ограничение составляет около ~ 1600, но, как ни странно, на 64-битном сервере Windows Server 2008 r2 с тоннами памяти ограничение было только около ~ 1200

Это точно такие же файлы tomcat5.exe и tomcat5w.exe, которые устанавливаются как служба точно таким же образом ... так что в этом нет никакого смысла ....

Почему увеличение памяти сверх отметки 1024 МБ должно производиться с шагом в 24 МБ? и почему существует другая "стена" с машиной с НИЖНЕЙ спецификацией, которая может достигать намного большего (1600 МБ), чем машина с более высокой спецификацией с большим количеством плунжера (~ 1200)

Я читал что-то о том, что JVM требует случайной памяти, но это просто чушь и вообще не имеет никакого смысла

Вы пробовали ... ну знаете .... погуглить? google.com/search?q=java+set+memory+limit

nitowa 16.12.2018 23:04

разве вы не знали ... прочтите ... ту часть, где я сказал, я уже тестировал с такими вещами, как настройки xmx на что-то вроде 1600 МБ или больше, но безрезультатно и вообще не имело никакого значения .... что в основном то, что google или duckduckgo все равно возвращается и как-нибудь?

ark angel 16.12.2018 23:10

Хорошо, я предполагаю, что вы пробовали использовать -xmx, а не -Xmx. Пока вы не дадите нам что-то осязаемое для работы (например, ваши флаги JVM), все, что я могу сделать, это ткнуть в темноту.

nitowa 16.12.2018 23:12

он настроен правильно, см. снимок экрана. но как только java.exe достигает около 300 МБ, он постоянно выдает сбой i.imgur.com/KnlFqlN.jpg

ark angel 16.12.2018 23:18

Можете ли вы опубликовать трассировку стека OOME? Скриншоты не показывают никаких доказательств OOM. Кроме того, можете ли вы убедиться, что процесс JVM действительно получает свою кучу 1,6 ГБ? Проверьте внутри самой JVM, чтобы убедиться, что это параметр «max heap memory», чтобы убедиться, что параметр вступает в силу.

Christopher Schultz 17.12.2018 16:11

хорошо, я добавил комментарии, см. мои правки

ark angel 18.12.2018 06:32

По-прежнему нет трассировки стека OOME или чего-либо еще из журналов, которые могут помочь диагностировать проблему ... (OOM = Out Of Memory)

Olaf Kock 18.12.2018 17:10

см. pastebin.com/xebjnpSA

ark angel 20.12.2018 06:06
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
8
748
2

Ответы 2

информации о вашем приложении не так много, но если я правильно понимаю, и вы запускаете его на автономном сервере Tomcat, вам следует установить конфигурацию памяти для Tomcat через файл конфигурации. Здесь вы можете найти описание - https://www.programmergate.com/tomcat-memory-usage/

set JAVA_OPTS=-Dfile.encoding=UTF-8 -Xms128m -Xmx2048m -XX:PermSize=265m -XX:MaxPermSize=1024m

Если вы используете что-то вроде Spring Boot или другой самовыполняемый метод, добавьте его в описание.

Здесь используется служба Windows. Переменные среды не действуют.

Christopher Schultz 17.12.2018 16:08

Поскольку вы упоминаете только «tomcat5» (даже не 5.5): обратите внимание, что последняя версия Tomcat 5.0 была выпущена в 2004 году, но даже если вы имеете в виду Tomcat 5.5, срок ее службы был прекращен в 2012 году. Tomcat 5 был основан на Java5, и вот где я ищу виновника:

(Обратите внимание, это было давно, и я перефразирую то, что до сих пор помню с того времени. Я мог бы указать только правильное направление, но не каждую деталь)

В те времена 32-битные виртуальные машины Java были более распространены, чем сегодня, а 32-битные процессы в 32-битной Windows обычно страдают от одной проблемы: им нужны непрерывные блоки памяти - абсолютный максимум, который может быть предоставлен 32-битному процессу (но только когда память еще не был фрагментирован) был где-то около 1,5 ГБ - независимо от того, сколько памяти было у машины.

Моя общая рекомендация - установить для -Xmx и -Xms значения такой же. Выделите все, что вы готовы выделить, в самом начале - вам нужно быть готовым к этому в любом случае, и нет необходимости ждать произвольного события, которое запускает условия OutOfMemory. Возможно, ваше приложение может обойтись 300 или 400 МБ, но пытается выделить больше, потому что вы разрешили ему сделать это со значением -Xmx, превышающим то, что может предоставить система. Вы скорее захотите обнаружить это состояние при запуске процесса (например, когда вы сидите рядом с компьютером), а не в воскресенье вечером в 3 часа ночи, когда служба остановится.

Если в вашей системе есть 32-битный компонент любой, сначала исправьте это, а затем повторите попытку. Вы также можете установить приоритетность обновления до среды, в которой вы можете получать обновления и текущие знания, вместо того, чтобы отставать более чем на десять лет (или даже более чем на полдесятилетия, в зависимости от фактической версии, которую вы используете).

FWIW, 32-битные JVM - даже в Windows :) - должны иметь возможность выделить кучу ~ 1,6 ГБ, прежде чем они начнут выходить из строя.

Christopher Schultz 17.12.2018 16:09

Да, должен :) Я видел меньше, когда много было запущено раньше. Учитывая то количество информации, которое у нас есть, мне было достаточно, чтобы выдвинуть эту безумную догадку.

Olaf Kock 17.12.2018 22:34

Я обновил комментарии с помощью редактирования на главной странице, так как комментарии здесь ограничены 100 символами или меньше и т. д.

ark angel 18.12.2018 06:32

Другие вопросы по теме