Как использовать холодильники, чтобы объяснить нетехническим людям работу куч и сборщиков мусора.

Если вам нужно объяснить нетехническим людям, почему приложению не хватает памяти и что вам нужно сделать, чтобы справиться с этой проблемой. Не беспокойтесь — просто поговорите о холодильниках. Все понимают холодильники.

У нас есть холодильник примерно подходящего размера для моей семьи, и мы постоянно что-то кладем и вынимаем из холодильника. Иногда холодильник заполнен на 50%, иногда на 95%. Насколько полно на самом деле просто зависит. Дело в том, что нас не волнует, насколько полон холодильник, пока он не переполнен. Вещи приходят и уходят все время. Холодильник — это «куча».

Когда холодильник начинает немного переполняться, мы быстро сканируем холодильник на наличие устаревших вещей и выбрасываем их. Эта быстрая очистка представляет собой «незначительную сборку мусора».

Через некоторое время в холодильнике появляются старые вещи, которые не замечаются при быстром сканировании. Итак, мы делаем полную чистку холодильника, смотрим на каждую вещь, проверяем срок годности, смотрим, не использует ли ее кто-нибудь. Пока мы это делаем, никто не может пользоваться холодильником. Эта деструктивная очистка представляет собой «крупную сборку мусора».

Подводя итог, можно сказать, что холодильник постоянно используется, и у нас бывают крупные и мелкие уборки, когда мы думаем, что он наполняется. Мы не возражаем, если холодильник заполнен на 50% или на 95%, мы просто хотим избежать необходимости делать генеральную уборку так часто, чтобы это мешало нормальной работе семьи. Это здоровый эффективный холодильник. Наш холодильник имеет подходящие размеры и моется без помех.

Проблема в том, что холодильник слишком мал. Однажды на Рождество я купил огромную индейку. В холодильник он просто не поместится. Даже после полной чистки. Наш холодильник (куча) слишком мал. Это «слишком мало» означает «недостаточно памяти».

Кроме того, за год у двух моих сыновей развился подростковый аппетит. У нас просто больше вещей входит и вынимается из холодильника, потому что нам нужно хранить больше вещей. Это требование росло с годами, но в основном холодильник слишком мал. Скорее всего, у нас будет слишком полный холодильник, и нам не хватит памяти.

Дело в кучах, в отличие от холодильников, заключается в том, что когда они слишком малы, даже если они заполнены всего на 0,0001%, единственный способ исправить это — выкинуть все и перезапустить — перезапустить виртуальную машину Java и начать заново с пустой холодильник.

Вот почему мы должны тщательно следить за тем, чтобы холодильник был подходящего размера и очищался эффективно. Если у нас «недостаточно памяти», это серьезная проблема, требующая перезапуска приложения.

Почему виртуальная машина Java такая? Двадцать лет назад сборка мусора была большой инновацией в вычислительном языке. Это означало, что разработчикам не нужно заниматься сложным управлением памятью. Они могли просто доверить холодильнику самоочищение. А с законом Мура, где память дешевела с каждым годом, это также сняло большую нагрузку. И в большинстве случаев этого достаточно. Если у вас всего несколько холодильников, и все они достаточно большие, вам не нужно слишком беспокоиться о холодильниках.

Однако в моей компании фактически более 500 холодильников. У некоторых холодильников, если они выходят из памяти, это серьезная проблема. И мы не хотим неэффективных затрат на то, чтобы просто сделать каждый холодильник намного больше, чем мы думаем, что он нам когда-либо понадобится. У нас много холодильников, и мы хотим, чтобы они были нужного размера, не слишком большими и не слишком маленькими.

Итак, интересная проблема, с которой мы столкнулись, заключается в том, как управлять сотнями куч (холодильников) и определять их размер, которые могут выполнять много разрушительной сборки мусора (очистки).

Если вы разбираетесь в холодильниках и заменяете слово «холодильник» на «кучу» и «очистить» на «сборку мусора», а содержимое холодильника на слово «объекты», вы, вероятно, так же хорошо понимаете управление памятью в Java, как и большинство других. Java-разработчики. :-)