Java: где-то скрыто ограничение памяти? - PullRequest
3 голосов
/ 14 июня 2009

У меня довольно интенсивная вычислительная программа на Java, которую я тестирую на сервере Linux. Он отлично работает на моем MacBook.

Если я запускаю его на сервере, происходит следующее: как только объем памяти достигает 324 МБ, программа начинает останавливаться. Очевидно, что некоторые ограничения запрещают использовать больше памяти, и сборщик мусора должен делать все больше и больше работы, чтобы оставаться ниже этого ограничения. В какой-то момент выдается «исключение GC превышено» исключение ».

Я запускаю Java с -Xmx16000m, так что не может быть предел памяти. Каковы другие возможные ограничения?

Это версии Java, которые я использую:

Macbook:

Java-версия "1.5.0_16"

Среда выполнения Java (TM) 2, Standard Edition (сборка 1.5.0_16-b06-284)

Клиентская виртуальная машина Java HotSpot (TM) (сборка 1.5.0_16-133, смешанный режим, совместное использование)

Сервер Linux:

Java-версия "1.6.0_12"

Java (TM) SE Runtime Environment (сборка 1.6.0_12-b04)

Java HotSpot (TM) 64-разрядная серверная виртуальная машина (сборка 11.2-b01, смешанный режим)

Ответы [ 4 ]

3 голосов
/ 14 июня 2009

Параллельный сборщик сгенерирует ошибку OutOfMemoryError, если на сборку мусора будет затрачено слишком много времени: если на сборку мусора будет потрачено более 98% общего времени и восстановлено менее 2% кучи, возникнет ошибка OutOfMemoryError выброшены.

Эта функция предназначена для предотвращения запуска приложений в течение продолжительного периода времени при небольшом прогрессе или его отсутствии, поскольку куча слишком мала. При необходимости эту функцию можно отключить, добавив параметр -XX: -UseGCOverheadLimit в командную строку.

2 голосов
/ 14 июня 2009

Используйте JConsole или JVisualVM для подключения к JVM во время выполнения. С помощью этих инструментов вы можете отслеживать использование памяти различными пулами памяти в вашей JVM. JVisualVM также позволяет вам профилировать ваше приложение на основе процессора или памяти. Это поможет вам лучше понять, почему ваше приложение ведет себя не так, как должно.

1 голос
/ 14 июня 2009

Спасибо за совет. Моя проблема, кажется, более конкретная, хотя. Нет ничего плохого в программе Java как таковой. Я звоню на Java из Jhek Mathematica. Теперь я понимаю, что ограничение 324 МБ должно исходить оттуда (где-то).

0 голосов
/ 14 июня 2009

Если это доступная основная память на машине. Если у вас закончится свободная память, ваша программа остановится независимо от того, сколько у вас виртуальной памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...