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