Увеличение использования памяти кучи Java

Я проводил быстрый эксперимент, чтобы посмотреть, как выглядит производительность памяти моего алгоритма. Размер входных данных составляет около 2 МБ, и алгоритму требуется около 1 секунды для его запуска. Я запустил это в цикле 500 раз, чтобы посмотреть на распределение памяти.

Вот как jConsole показывает использование памяти:

введите здесь описание изображения

Как вы можете видеть, использование памяти кучи увеличивается (вроде как экспоненциально) каждые два раза перед запуском GC (даже если входные данные одинаковы).

Кто-нибудь знает, ожидается ли это и почему это происходит? Это какая-то оптимизация, сделанная JVM?

Спасибо!


person N3da    schedule 11.07.2014    source источник
comment
Прочтите docs.oracle.com/cd/E19900-01 /819-4742/abeik/index.html   -  person user1071777    schedule 11.07.2014
comment
похоже, что ваш алгоритм требует больше времени для запуска. Вы уверены, что используете одинаковое количество итераций?   -  person JohnnyAW    schedule 11.07.2014
comment
@JigarJoshi, если вы посмотрите на память после GC, вы увидите, что утечки памяти нет (по крайней мере, не большой)   -  person Peter Lawrey    schedule 11.07.2014
comment
Я согласен - это не признак утечки памяти.   -  person Hot Licks    schedule 11.07.2014
comment
Вы не можете сказать, ожидается ли это, не зная алгоритма.   -  person Ale Sequeira    schedule 11.07.2014


Ответы (1)


Кто-нибудь знает, ожидается ли это и почему это происходит? Это какая-то оптимизация, сделанная JVM?

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

утечка?

Если вы посмотрите на использование памяти после GC, вы увидите, что это почти то же самое, поэтому очевидно, что утечки памяти нет. Или, по крайней мере, не большой.

Вы должны посмотреть на память, используемую после полного GC, чтобы подтвердить наличие утечки памяти, и я предполагаю, что это второстепенные коллекции.

person Peter Lawrey    schedule 11.07.2014
comment
вы правы, однако один и тот же набор данных на разных итерациях одного и того же алгоритма вызывает всплеск памяти, выглядит подозрительно +1 - person jmj; 11.07.2014
comment
@JigarJoshi JVM будет постепенно изменять параметры GC. Они старались не менять их слишком резко, поэтому геометрическое увеличение не так уж удивительно. найти можно увеличить, удвоить, найти можно увеличить, удвоить и т.д. - person Peter Lawrey; 11.07.2014
comment
Спасибо, Питер. Это имеет смысл и точно соответствует тому, что здесь происходит. Также я использовал YourKit и убедился, что утечки памяти нет. Просто создается много объектов HashMap. Кстати, можете ли вы объяснить (или указать мне на документацию) о том, как настраиваются параметры GC? Почему использование большего количества памяти => GC реже? - person N3da; 12.07.2014
comment
@ N3da N3da Вы выделяете мусор с определенной скоростью. скажем, 400 МБ/с. если у вас есть пространство eden размером 400 МБ, оно будет GC каждую секунду, потому что именно столько времени вам потребуется, чтобы заполнить его. 400 МБ / 400 МБ/с = 1 с. Если у вас есть куча размером 4 ГБ, она будет выполнять GC каждые 10 секунд, 4000 МБ / 400 МБ/с = 10 с. - person Peter Lawrey; 12.07.2014