Как да използвате хладилници, за да обясните Heaps & Garbage Collectors на нетехнически хора.

Ако трябва да обясните на хора, които не са технически специалисти, защо на дадено приложение му липсва памет и какво трябва да направите, за да управлявате този проблем. Не се притеснявайте - просто говорете за хладилници. Всеки разбира от хладилници.

Имаме хладилник с приблизително подходящия размер за моето семейство и винаги слагаме и изваждаме неща в хладилника и през цялото време. Понякога хладилникът е пълен на 50%, понякога хладилникът е пълен на 95%. Доколко наистина е пълно зависи само. Въпросът е, че не ни притеснява колко е пълен хладилникът, стига да не е прекалено пълен. Нещата влизат и излизат през цялото време. Хладилникът е „купчината“.

Когато хладилникът започне да се пълни малко, ние извършваме бързо сканиране за остарели неща, датираме нещата в хладилника и ги изхвърляме. Това бързо почистване е „незначително събиране на боклук“.

След известно време в хладилника има стари неща, които се пропускат при бързо сканиране. Затова правим пълно почистване на хладилника, разглеждаме всяко нещо, проверяваме срока му на годност, виждаме дали някой го използва. Докато правим това, никой не може да използва хладилника. Това разрушително почистване е „голямо събиране на боклука“.

В обобщение, хладилникът се използва през цялото време и имаме големи и малки почиствания, както и когато смятаме, че се пълни. Нямаме нищо против дали хладилникът е пълен на 50% или на 95%, просто искаме да избегнем необходимостта да извършваме основно почистване толкова често, че да наруши нормалните семейни операции. Това е здравословен и ефективен хладилник. Нашият хладилник е с правилния размер и се почиства по безпроблемен начин.

Проблемът е, когато хладилникът е твърде малък. Една Коледа си купих масивна пуйка. По принцип просто няма да се побере в хладилника. Дори след като направих пълно почистване. Нашият хладилник (куп) е твърде малък. Това „твърде малко“ е „изчерпателна памет“.

Освен това през годината двамата ми сина развиха тийнейджърски апетит. Просто имаме повече неща, които влизат и излизат от хладилника, защото трябва да съхраняваме повече неща. Това изискване се е прокрадвало през годините, но като цяло хладилникът е твърде малък. Вероятно ще получим твърде пълен хладилник и ще останем без памет.

Нещото при Heaps, за разлика от хладилниците, е, че когато са твърде малки, дори и само с 0,0001% над пълния, единственият начин да го поправите е да изхвърлите всичко и да го рестартирате - рестартирайте Java Virtual машината и започнете отново с празен хладилник.

Ето защо трябва внимателно да се уверим, че хладилникът е с правилния размер и се почиства ефективно. Ако останем без памет, това е сериозен разрушителен проблем и изисква рестартиране на приложението.

Защо виртуалната машина на Java е такава? Преди двадесет години събирането на отпадъци беше голяма иновация в компютърния език. Това означаваше, че разработчиците не трябва да се занимават със сложната работа с управлението на паметта. Те могат просто да се доверят на хладилника, за да се погрижи да се почисти. И със закона на Мурс, където паметта ставаше по-евтина всяка година, това също премахна много напрежение. И през повечето време това е достатъчно добро. Ако имате само няколко хладилника и всички те са достатъчно големи, не е нужно да се тревожите твърде много за хладилниците.

Въпреки това, в моята компания имаме ефективно над 500 хладилника. Някои от хладилниците, ако им свърши паметта, това е сериозен проблем. И ние не искаме неефективните разходи просто да направим всеки хладилник много по-голям, отколкото смятаме, че някога ще ни трябва. Имаме много хладилници, които трябва да управляваме, и искаме да сме сигурни, че са с правилния размер, не са твърде големи и не твърде малки.

Така че интересният проблем, който имаме, е как да управляваме и оразмеряваме стотици купчини (хладилници), които може да извършват много разрушително събиране на боклука (почиствания).

Ако разбирате от хладилници и замените думата „хладилник“ с Heap и „изчистване“ със събиране на боклук, а съдържанието на хладилника с думата „обекти“, вероятно имате толкова добро разбиране за управление на паметта на Java, колкото повечето Java разработчици. :-)