Използването на паметта на Java heap се увеличава

Правех бърз експеримент, за да видя как изглежда производителността на паметта на моя алгоритъм. Входът е около 2 Mb и алгоритъмът отнема около 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-ing. Ако използвате повече памет, не е нужно да GC толкова често.

изтичане?

Ако погледнете използването на паметта след 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 Вие разпределяте боклук с определена скорост. да речем 400 MB/s. ако имате 400 MB eden пространство, то ще GC всяка секунда, защото това е колко време ви отнема да го запълните. 400 MB / 400 MB/s = 1 s. Ако имате 4 GB купчина, тя ще GC на всеки 10 секунди, 4000 MB / 400 MB/s = 10 s. - person Peter Lawrey; 12.07.2014