получение "java.lang.OutOfMemoryError: невозможно создать новый" на VPS, хотя и имеет достаточно памяти - PullRequest
0 голосов
/ 02 декабря 2011

Я просто не могу понять, почему я получаю эту ошибку. Это не всегда отображается, но как только оно появляется, мое приложение отказывается принимать соединения (не может создавать новые Socket-Threads, а также другие потоки, которые я создаю в своем JAVA-приложении, для некоторых из них я использую ThreadPool).

top и htop показывает мне, что используется ~ 900 МБ 2048 МБ. а также достаточно памяти кучи, около 200 МБ свободного.

cat / proc / sys / kernel / threads-max выводит:

1196032

а также, несколько дней назад все работало нормально, это многопользовательская онлайн-игра, и у нас в сети было более 200 пользователей (всего ~ 500 потоков). Но теперь даже при 80 пользователях в сети (~ 200 потоков) через 10 минут или несколько часов мое приложение каким-то образом сломалось из-за этой ошибки OutOfMemoryError. В этом случае я перезапускаю свое приложение, и оно снова работает только в течение этого короткого периода времени.

Мне очень любопытно, что если JVM будет странно работать на VPS, поскольку другие VPS на той же физической машине также используют JVM. Это вообще возможно? Есть ли какой-то лимит по провайдеру, что мне не видно? Или есть какая-то атака сервера?

Я должен также упомянуть, что ко времени возникновения этой ошибки иногда munin не может регистрировать данные в течение примерно 10 минут. Глядя на графические изображения, там просто пробел, как будто Мунин вообще не работает. И опять-таки, около 1 ГБ памяти свободно, как мне подсказывает htop.

Может быть, мы тоже, я каким-то образом выдал ошибку в своем приложении. И начать получать эту ошибку после того, как я сделал обновление. Но даже в этом случае, где я могу начать отладку?

Ответы [ 4 ]

1 голос
/ 02 декабря 2011

Вы, кажется, размещаете свое приложение на некотором удаленном vps-сервере. Вы уверены, что на сервере, а не на вашем компьютере для разработки, достаточно оперативной памяти? Люди очень часто путают свою машину с удаленной машиной.

Потому что если у Bash тоже не хватает памяти, это, очевидно, проблема с системной памятью, а не проблема с памятью приложения. Опубликуйте результаты free -m и ulimit -a на удаленной машине, чтобы получить больше данных.

Если вы не доверяете своему провайдеру использовать какие-либо троянизованные htop, free и ulimit, вы можете проверить реальную доступную память с помощью простого програна C, в котором вы выделяете с помощью malloc 70 ~ 80% ваших доступных ОЗУ и присвоение ему случайных байтов не более чем в 10 строках кода ANSI C. Вы можете статически скомпилировать его на своем боксе, чтобы избежать любых кривых libc, а затем передать его с помощью scp. При этом я слышал, что провайдеры VPS дают меньше, чем обещали, но никогда не сталкивались с ними.

1 голос
/ 02 декабря 2011

попробуйте увеличить размер стека (-Xss)

0 голосов
/ 02 марта 2013

Вы должны попробовать JRockit VM , он отлично работает на моем VPS OpenVZ, он потребляет намного меньше памяти, чем Sun / Oracle jvm.

0 голосов
/ 04 декабря 2011

Хорошо переход с VPS на выделенный сервер решил мою проблему.Кроме того, я нашел это

https://serverfault.com/questions/168080/java-vm-problem-in-openvz

, это может быть именно так, потому что на VPS у меня было слишком низкое значение для "privvmpages".Кажется, что в VPS действительно странное поведение JVM.Как я уже писал в комментариях, даже другие программы (ls, top, htop, less) не могли запуститься в какое-то время, хотя достаточно памяти было доступно / свободно.И ... провайдер действительно внес некоторые изменения в свою Систему.

А также спасибо всем за очень быстрый ответ и помощь в разгадке этой тайны.

...