Используемая и свободная память на Java - PullRequest
1 голос
/ 09 марта 2012

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

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

Ответы [ 3 ]

3 голосов
/ 09 марта 2012

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

Объяснение памяти Java (SUN JVM)

2 голосов
/ 09 марта 2012

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

Если на самом деле это ГБ, у вас огромныйCodeBase или хранить много объектов в оперативной памяти.Возможно, все еще выделено много объектов, которые не могут быть использованы GC.

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

1 голос
/ 09 марта 2012

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

JVM резервирует этомного виртуальной памяти при запуске, но операционная система не выделяет память приложению до тех пор, пока оно ее не использует.

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

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

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