java.lang.OutOfMemoryError: пространство кучи Java с ограничением java.exe в 300 МБ - PullRequest
0 голосов
/ 17 декабря 2018

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

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

Ошибка, которую я получаю, выглядит так:

ОШИБКА результирующего набора Исключение вобработка запроса (4): java.lang.OutOfMemoryError: Java heap space

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

Кто-нибудь знает, что происходит?

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

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

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

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Поскольку вы упоминаете только «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-битный компонент в вашей системе, сначала исправьте это, затем повторите попытку.Возможно, вы также захотите установить приоритет обновления в среду, в которой вы можете получать обновления и текущие знания, а не отставать более чем на десятилетие (или даже более, чем на пол десятилетия, в зависимости от используемой версии).

0 голосов
/ 17 декабря 2018

не так много информации о вашем приложении, но если я правильно понимаю, и вы запускаете его на автономном сервере 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 или другую самореализуемую технику, пожалуйста, добавьте его в описание.

...