Это очень утомительный вопрос, и я чувствую, что многие выступают против Java, несмотря на то, насколько он полезен для языка.
Тот факт, что вы не можете доверять «System.gc» делать что-либо, невероятно пугающий и может легко вызвать чувство «страха, неуверенности, сомнения» в языке.
Во многих случаях полезно иметь дело с скачками памяти, которые вы намеренно вызываете до того, как произойдет важное событие, которое заставит пользователей думать, что ваша программа плохо спроектирована / не отвечает.
Возможность контролировать сборку мусора была бы очень хорошим образовательным инструментом, в свою очередь, улучшая понимание людьми того, как сборка мусора работает и как программы используют ее поведение по умолчанию, а также контролируемое поведение.
Позвольте мне рассмотреть аргументы этой темы.
- Это неэффективно:
Часто программа может ничего не делать, и вы знаете, что она ничего не делает из-за того, как она была задумана. Например, он может выполнять какое-то долгое ожидание с большим окном сообщения ожидания, и в конце он может также добавить вызов для сбора мусора, потому что время его запуска займет действительно небольшую долю времени долгое ожидание, но gc не будет действовать в середине более важной операции.
- Это всегда плохая практика и указывает на неработающий код.
Я не согласен, не имеет значения, какой у вас сборщик мусора. Его работа состоит в том, чтобы отслеживать мусор и убирать его.
Вызывая gc во время, когда использование менее критично, вы уменьшаете шансы его запуска, когда ваша жизнь зависит от того, какой код выполняется, но вместо этого он решает собирать мусор.
Конечно, он может вести себя не так, как вы хотите или ожидаете, но когда вы действительно хотите позвонить, вы знаете, что ничего не происходит, и пользователь готов терпеть медлительность / время простоя. Если System.gc работает, отлично! Если это не так, по крайней мере, вы пытались. Там просто нет недостатка, если сборщик мусора не имеет внутренних побочных эффектов, которые делают что-то ужасно неожиданное для поведения сборщика мусора, если он вызывается вручную, и это само по себе вызывает недоверие.
- Это не обычный случай использования:
Это вариант использования, который не может быть достигнут надежно, но может быть, если система была разработана таким образом. Это все равно, что сделать светофор и сделать так, чтобы некоторые / все кнопки светофора ничего не делали, это заставляет вас задаться вопросом, почему кнопка существует для начала, в javascript нет функции сбора мусора, поэтому мы Тщательно изучите это.
- В спецификации говорится, что System.gc () является подсказкой, что GC должен работать, а виртуальная машина может игнорировать это.
что такое "подсказка"? что такое "игнорировать"? компьютер не может просто получать подсказки или игнорировать что-то, существуют строгие поведенческие пути, которые могут быть динамическими и руководствуются намерениями системы. Правильный ответ будет включать то, что фактически делает сборщик мусора на уровне реализации, что заставляет его не выполнять сбор, когда вы запрашиваете его. Эта функция просто нет? Есть ли какие-то условия, которые я должен выполнить? Каковы эти условия?
В настоящее время Java GC часто кажется монстром, которому вы просто не доверяете. Вы не знаете, когда он придет или уйдет, вы не знаете, что он собирается делать, как он собирается это делать. Я могу себе представить, что некоторые эксперты лучше понимают, как их сборщик мусора работает на основе каждой инструкции, но подавляющее большинство просто надеется, что это «просто работает», и необходимость доверять непрозрачному алгоритму, выполняющему для вас работу, разочаровывает.
Существует большой разрыв между чтением чего-либо или обучением чему-либо, и фактическим наблюдением за реализацией этого, различиями между системами и возможностью играть с этим без необходимости смотреть на исходный код. Это создает уверенность и чувство мастерства / понимания / контроля.
Подводя итог, можно сказать, что в ответах есть одна проблема: эта функция может ничего не делать, и я не буду вдаваться в подробности, как определить, когда она что-то делает, а когда нет, и почему она не будет или не будет, часто намекает на то, что попытка сделать это просто против философии, даже если намерения, стоящие за ней, разумны ».
Для Java GC может быть нормально вести себя так, как оно есть, а может и нет, но, чтобы понять это, трудно действительно понять, в каком направлении идти, чтобы получить исчерпывающий обзор того, что вы можете доверять GC и не делать, так что слишком просто просто не доверять языку, потому что цель языка - контролировать поведение до философского уровня (программисту, особенно новичкам, легко впасть в экзистенциальный кризис от определенных поведений системы / языка) способны терпеть (и если вы не можете, вы просто не будете использовать язык, пока вам не придется), и больше вещей, которые вы не можете контролировать без какой-либо известной причины, почему вы не можете контролировать их, по своей сути вредны.