У меня есть веб-приложения, которые работают на tomcat5 mysql и используют JVM и java и т.д., он работает нормально, но каждый раз, когда он начинает получать около 300 МБ памяти для java.exe (сервер Windows), он вылетает при выполнении запроса или что-нибудь, что вообще занимает какое-то место в таране. Но у самого сервера машины 16 ГБ оперативной памяти ....
Как это преодолеть?
Я получаю такую ошибку:
ERROR набор результатов Исключение при обработке запроса (4): java.lang.OutOfMemoryError: Java heap space
и если я убью задачу java.exe и перезапущу процесс, он снова будет работать, пока java.exe не достигнет какой-то стены памяти 300 МБ .... Я уже пробовал установить xmx на что-то вроде 1600 МБ или больше, но безрезультатно и вообще не имел никакого значения ....
кто-нибудь знает, что происходит?
///////////////
ОБНОВЛЕНИЕ С КОММЕНТАРИЯМИ
хорошо, есть что-то странное, что я понял, если я установил его на что-либо на 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 требует случайной памяти, но это просто чушь и вообще не имеет никакого смысла
разве вы не знали ... прочтите ... ту часть, где я сказал, я уже тестировал с такими вещами, как настройки xmx на что-то вроде 1600 МБ или больше, но безрезультатно и вообще не имело никакого значения .... что в основном то, что google или duckduckgo все равно возвращается и как-нибудь?
Хорошо, я предполагаю, что вы пробовали использовать -xmx, а не -Xmx. Пока вы не дадите нам что-то осязаемое для работы (например, ваши флаги JVM), все, что я могу сделать, это ткнуть в темноту.
он настроен правильно, см. снимок экрана. но как только java.exe достигает около 300 МБ, он постоянно выдает сбой i.imgur.com/KnlFqlN.jpg
Можете ли вы опубликовать трассировку стека OOME? Скриншоты не показывают никаких доказательств OOM. Кроме того, можете ли вы убедиться, что процесс JVM действительно получает свою кучу 1,6 ГБ? Проверьте внутри самой JVM, чтобы убедиться, что это параметр «max heap memory», чтобы убедиться, что параметр вступает в силу.
хорошо, я добавил комментарии, см. мои правки
По-прежнему нет трассировки стека OOME или чего-либо еще из журналов, которые могут помочь диагностировать проблему ... (OOM = Out Of Memory)
информации о вашем приложении не так много, но если я правильно понимаю, и вы запускаете его на автономном сервере 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. Переменные среды не действуют.
Поскольку вы упоминаете только «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 ГБ, прежде чем они начнут выходить из строя.
Да, должен :) Я видел меньше, когда много было запущено раньше. Учитывая то количество информации, которое у нас есть, мне было достаточно, чтобы выдвинуть эту безумную догадку.
Я обновил комментарии с помощью редактирования на главной странице, так как комментарии здесь ограничены 100 символами или меньше и т. д.
Вы пробовали ... ну знаете .... погуглить? google.com/search?q=java+set+memory+limit