2014-11-24 18 views
0

Одна из наших систем соков (стек PI ABAP + JAVA) давала проблемы с производительностью. Все 64 ГБ, сконфигурированные для машины, забиты (и 8 ядер). Каждый подозревает часть java, но я думаю, что это разные.Когда куча jvm выделена ОС

Узлы сервера Java, где выполняется перезапуск с ошибкой Out Of Memory. Глядя на hprof-файлы, я обнаружил, что они имеют размер всего 1.2G (средний 3-х серверных узлов), когда для узлов сервера настроено 3 ГБ (как -Xms и Xmx). Это наблюдение приводит к следующим сомнениям.

Я читал, что когда Xms и Xmx установлены на одно и то же значение, jvm выделяет всю кучу при ее запуске. Если в этом случае серверные узлы будут иметь 3 ГБ кучи с самого начала. Если да, то почему это не отражается в файле hprof или если hprof содержит только память, выделенную объектам во время выполнения, размер явно указывает, что кучная память свободна (более 50%), поэтому как ошибка OOM. .. !! .. ??

Я также знаю, что Linux делает что-то, называемое памятью по-фиксации. т.е. память на самом деле не указана, когда она запрашивается, но когда она фактически используется. Это способствует исключению из памяти. Подобно тому, как JVM запускает os, он говорит, что вам было выделено 3 ГБ памяти, но на самом деле откладывает его, пока он не понадобится. К тому моменту, когда jvm на самом деле пытается выделить память для объектов, некоторые другие приложения могли бы исчерпать память. Это возможно...??

Даже если у узлов java была проблема с утечкой памяти, не ограничивалась ли она 3 ГБ кучи. Как он может разбудить всю 64G физической памяти .... ???

Еще одна вещь, которую я наблюдал, заключалась в том, что пространство подкачки использовалось только на 50%.

Любой свет на этом ...!

+0

Я думаю, что у вас больше шансов получить ответ на serverfault.com – vwegert

+0

спасибо..поставлено в serverfault также – varun

ответ

0

hprof не показывает фактический размер кучи, и его размер зависит от многих факторов, таких как включенные/отключенные сжатые ссылки, разметка полей (размер объекта - это не просто сумма размеров его полей, но также заголовки и некоторые пробелы между полями) и так далее.

О резервировании памяти. JVM резервирует память для кучи, но ОС не выделяет память до тех пор, пока она не понадобится.

Я бы рекомендовал использовать профилировщики памяти (я очень рекомендую профилировщик MyKit) для подключения к виртуальной машине, а затем для анализа использования памяти.

Смежные вопросы