/ / Дуже великий розмір кучи, але мала використана пам'ять - java, пам'ять, сміттєві збірки, куча

Дуже великий розмір кучи, але невелика використовувана пам'ять - java, пам'ять, сміття-збірка, куча

У моєму застосуванні я бачу дуже великий розмір шара, але використовувана пам'ять дуже мала:

Розмір куку: 10 Гб +, Використана пам'ять: 500 Мб

Що це пояснює? Чому не зменшується розмір кубиків? Графік пам'яті http://i48.tinypic.com/b5423a.png

Мої параметри пам'яті Java:

-Xms8448м -Xmx12544м -XX: PermSize = 192м -XX: MaxPermSize = 256м -XX: + UseConcMarkSweepGC -XX: CMSInitiatingOccupancyFraction = 60

Будь ласка, поради, чому ця дивна поведінка. Я бачу використовувану пам'ять у вигляді сміття, зібраного в графі, але що неправильно з пам'яттю Heap ????

Відповіді:

5 за відповідь № 1

Початкова куча розміру з вашого аргументу

-Xms8448m

більше 8 Гб. Крім того,

-Xmx12544m

дає JVM дозвіл дозволити цьому зростати на більш12 Гб, і це може зробити це, і ніколи не відпускати його, якщо пам'ять доступна, і вважає, що це найкращий розмір кучи для зберігання. У специфікаціях просто немає нічого, що JVM має намагатися зберегти розмір купи невеликим.


2 для відповіді № 2

Розмір купи в HotSpot JVM ніколи не знижуватиметься. Хоча деякі алгоритми GC банці дають пам'ять для ОС. Але в більш пізньому випадку JConsole не покаже вам зменшення пам'яті (у JConsole ви бачите область адресного простору, зарезервовану для купи), слід використовувати моніторинг пам'яті процесу операційної системи, щоб побачити, що JVM фактично випускає пам'ять.

Алгоритми, які можуть повернути невикористану пам'ять для ОС, є

  • серійний колектор (-XX: + UseSerialGC)
  • G1 (-XX: + UseG1GC)

0 для відповіді № 3

Ви вказали розмір початкової купи ~ 8,5 Гб -Xms8448m. Деякі реалізації java не підтримують фактичне зменшення купи (часто через обмеження системи). Скоротіть це значення для меншої початкової купи.


0 для відповіді № 4

Видаліть вище -Xms8448м. Вона вказує початковий розмір Heap. Якщо ви видалите це, це повинно працювати, як очікувалося.


0 для відповіді № 5

JVM зберігає максимальний розмір купи при запуску як віртуальну пам'ять. Скільки в пам'яті основної пам'яті залежить від того, скільки він використовується.

Коли ви встановлюєте мінімальну пам'ять, воно не гарантує його використання, але це робить лише мінімальні спроби обмежити використання пам'яті до цієї точки.

але чому розмір Heap розміщений майже на 12 Гб?

Саме це ви встановили.