Каково максимальное пространство кучи Java для SuSE Linux - PullRequest
0 голосов
/ 29 июня 2009

Этот вопрос относится к Java отказывается запускаться - не удалось восстановить достаточно места для кучи объектов и должно быть достаточно легко выяснить. Тем не мение; мои поиски не дали ничего полезного.

По сути, у нас есть 2 32-битных ОС (RedHat & SuSE) на разных машинах с одинаковым оборудованием. Оба используют одну и ту же JVM, обе выполняют одну и ту же командную строку. RedHat прекрасно работает, но SuSE сообщает, что памяти недостаточно.

Нам просто нужно знать, является ли это ограничением версии SuSE, которую мы используем, или это что-то еще.

'cat / proc / version' дает нам:

Linux version 2.6.5-7.244-bigsmp (geeko@buildhost) (gcc version 3.3.3 (SuSE Linux)) #1 SMP Mon Dec 12 18:32:25 UTC 2005

'uname -a' дает нам следующее на ОБАХ типах машин:

UTC 2005 i686 i686 i386 GNU/Linux

Ответы [ 2 ]

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

Предел памяти JVM связан с самым большим свободным непрерывным доступным блоком , а не с объемом свободной памяти. Предел варьируется от 1,4 ГБ до чуть более 2,0 ГБ и зависит от того, где ваша операционная система помещает различные вещи в память. Я не знаю подробностей о том, где Redhat или Suse загружают вещи в память, но может случиться так, что suse отображает некоторую библиотеку на адрес в середине ОЗУ, где Redhat может отобразить ее в конце (спекуляция).

И помните, что ваше фактическое использование памяти в java на больше, чем , что вы указываете для Xmx. Другие настройки памяти также влияют на размер вашей кучи (например, permgen). Таким образом, также может быть, что в перманентном пространстве в Suse задано значение по умолчанию больше, чем в Redhat.

Кроме того, в зависимости от профиля распределения памяти вашего приложения, вам может потребоваться меньший размер кучи и различные параметры сбора мусора. Здесь есть некоторые подробности (http://java.sun.com/performance/reference/whitepapers/tuning.html) и другие места. Например, если вы выделяете много небольших временных блоков, вам понадобятся другие настройки GC, чем если у вас много битовых, долгоживущих объектов .

Что касается связанного вопроса, почему бы просто не использовать Redhat? Это может быть упрощенное решение, но я гарантирую, что оно решит вашу проблему быстрее, чем углубится в тайный мир настройки Java и управления памятью ОС: P

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

Во-первых, вы без ума от того, что работаете с 32-битной ОС, когда у вас такое большое давление на адресное пространство. Миграция на 64-битную JVM в 64-битной Linux. Сколько времени вы уже потратили, пытаясь диагностировать эту проблему, которая, как вы подозревали, с самого начала могла бы уйти из-за большего адресного пространства 64-битной системы?

Во-вторых, хорошо известно, что из всех поставщиков Linux в Red Hat работает большинство инженеров-ядерщиков, и они вносят серьезные изменения в ядра в своих продуктах RHEL. Они часто включают исправления для больших рабочих нагрузок, подобных вашей (ну, это большая нагрузка для 32-битной системы, для 64-битной - ничего особенного). Таким образом, есть некоторый шанс, что в конечном итоге причина в том, что у RHEL есть другие клиенты, которые делают то же самое, что и вы, и вы получаете выгоду от работы, которую они проделали, чтобы поддержать этих клиентов.

И наконец, поскольку я подозреваю, что вы будете настаивать на попытке найти способ сделать это на 32-битной SuSE, я укажу, что Linux предлагает множество компромиссов в адресном пространстве на 32-битной x86, и возможно (но не обязательно), что в ваших системах SuSE выбран другой компромисс. Если вы можете вызвать конфигурацию запущенных ядер (часто в / boot / config ....), вы можете сравнить настройки, такие как HIGHMEM.

Обычный вариант, который несколько лет назад был разделен на 2: 2, то есть пользовательское пространство ограничено 2 ГБ адресного пространства, простое решение для программирования, и оно имеет приличную эффективность, но в этом сценарии, очевидно, вы не можете получить запрошенный куча, так как это не оставило бы места для текста программы, стека и т. д. В последнее время наблюдается тенденция к 3: 1 (аналогично переключателю Windows / 3GB), который расширяет адресное пространство пользовательского пространства за счет того, что само ядро ​​ОС становится меньше. пространство, которое потенциально вызывает свои проблемы. Это может сработать, но это будет очень тесно, поэтому я также не удивлюсь, если это не сработает для вашей работы. Наконец, более новые ядра Linux также предлагают вариант, при котором вы получаете 32-битное пользовательское пространство 4 ГБ, которого может быть достаточно для надежной работы ваших заданий при значительных затратах на производительность, поскольку очевидно, что пользовательское пространство и адреса ядра не могут сосуществовать.

Чтобы попробовать это, вам понадобится новое ядро. Возможно, вам удастся просто установить один из них, предоставленный SuSE (посмотрите, предлагают ли они другие варианты, например, вариант «PAE»), или вам, возможно, придется скомпилировать свой собственный вариант, и в этом случае он, вероятно, лишит законной силы ваш контракт на поддержку.

Но на самом деле, вам просто нужно перейти с вариантом 1, переключиться на 64-битную JVM и поднять ноги.

...