2012-03-09 4 views
1

Я пытаюсь улучшить производительность своего веб-приложения, поэтому я решил сделать его профилирование.
При этом я заметил, что после завершения длительного процесса, когда я запустил диспетчер задач, я увидел, что java.exe занимает слишком много памяти.
Используемая и свободная память в Java

Кстати, я проверил его через 2-3 часа после завершения процесса, и процессор находится в стабильном состоянии.
я видел в VM зрения elementry в профилировщика, использовано память 5 GB и свободной памяти 15 Гб и в диспетчере задач общий объем памяти, используемый java.exe является 41 Гб.
Что это за свободная память?
Это что-то вроде этого, так много памяти будет занимать java?
Я заметил, что при запуске процесса и использовании используемой памяти, а также свободной памяти растет, но после завершения использования память уменьшилась, но не освободилась.
Мне интересно, есть ли какие-либо проблемы с моим приложением или это нормально?

+1

Когда вы пишете свой вопрос, не инкапсулируйте текст без кода в стиль кода.Это очень уродливый и не очень хороший способ подчеркнуть важные части. – Juvanis

+0

Не обижайтесь, но я думаю, что вы должны сначала cHeck как настроить jvm и что посмотреть, когда вы просматриваете свое приложение Java. – aviad

+0

Вы говорите, что максимальный размер кучи составляет 64 ГБ, а у вас есть машина с 96 или более GC? –

ответ

3

Профилиторы обычно показывают использование памяти кучи. Таким образом, вероятно, используется 5 ГБ вашей кучи, и доступно 15 ГБ. Диспетчер задач показывает общую память, используемую процессом, которая включает в себя кучную память и память без кучи, такую ​​как память «Пермский генератор» в Sun JVM. В следующем посте есть хорошая коллекция ресурсов, чтобы понять это подробно.

Java Memory explained (SUN JVM)

2

Вы уверены, что это ГБ и не м.б.? Я не пытаюсь что-либо подразумевать, но это огромное количество барана для системы, которую вы еще не профилировали. И мне было бы интересно узнать, какой тип приложения это то, что написано на Java, и потребляет столько барана. У нас есть эти большие серверы ram на работе, но мы запускаем системы EMR для системы больниц с тысячами пользователей одновременно (работает Java ...).

Если infact это GB, у вас есть огромная база кода или хранилище большого количества объектов в ram. Возможно, выделено много объектов, которые не могут быть использованы GC.

Если я правильно понимаю ваш инструмент, он объясняет, что Java резервирует системный RAM, но не выделяет его объектам. Это будет ваш свободный баран. Используемая память - это то, что потребляется кодовой базой и объектами в памяти. Java иногда будет использовать ram, который в настоящее время не используется, и не выводить его в ОС, чтобы обеспечить непрерывность адресов памяти (предотвращает фрагментацию RAM). Mike

+0

Да, Майкл, я уверен, что он в GB. У меня есть машина с объемом памяти 100 ГБ. –

1

При запуске сервера JVM он устанавливает максимальный размер кучи в 1/4 памяти по умолчанию, но я подозреваю, что вы установили максимальный размер кучи на 40 ГБ.

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

Это означает, что вы можете установить максимум до 80 ГБ, и он, по-видимому, будет использовать виртуальную виртуальную машину 80 ГБ сразу (даже для мировой программы приветствия). Фактическая используемая память может быть намного меньше.

В вашем случае размер кучи вырос до 20 ГБ (коснулся приложения), в котором вы используете 5 ГБ и 15 ГБ, не используется. Если вы использовали больше памяти, размер кучи может вырасти до 40 ГБ.

+0

Так что он не выпустит эту память даже после завершения процесса, когда эта много памяти не нужна? –

+0

Когда существует JVM, вся память освобождается. Неиспользуемая память может быть заменена на диск, а основная память используется повторно, но, как правило, это плохая идея. Каковы ваши полные GC-времена, например, если вы используете до 20 ГБ? BTW: JVM Azul является единственным JVM, которого я знаю, который возвращает память в ОС. –

+0

Полное время GC составляет около 14 минут. Это имеет значение? –

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