У моєму застосуванні я бачу дуже великий розмір шара, але використовувана пам'ять дуже мала:
Розмір куку: 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 Гб?
Саме це ви встановили.