Вопрос в том, сколько объектов может быть собрано для сбора мусора прямо перед // Some other code.
Вопрос бессмысленный.
Сборщики мусора действуют во время выполнения по доступной там информации. Достижимость определяется глобальными корнями, хранящимися в регистрах, в стеках потоков и в глобальных переменных. Содержимое регистров и стеков является кульминацией многих этапов компиляции, которые полностью искажают код. Понятий лексической области видимости и номеров строк из исходного кода больше не существует, поэтому бессмысленно задавать вопросы о том, что GC может видеть в определенных точках исходного кода, потому что эти точки не существуют в мире GC.
Таким образом, мы должны сначала предположить прямое соответствие между исходным кодом и сгенерированным кодом, иначе мы не сможем даже понять смысл в коде, к которому относится вопрос. Я не могу представить себе какую-либо работающую виртуальную машину, которая на самом деле делает это на практике, и, фактически, в Java, вероятно, есть языковые конструкции высокого уровня, которые невозможно даже скомпилировать в байт-код таким образом.
Далее, мы должны принять модель того, как локальные ссылки хранятся в стеке. Вместо того, чтобы предполагать какую-то плохо определенную модель для получения случайного ответа, я собираюсь показать, что выбор модели позволяет нам находить ответы в диапазоне от «ничего не подходит для GC» до «все подходит для GC». Этот полный диапазон оправданных ответов действительно подчеркивает, насколько плох этот вопрос.
Рассмотрим простую модель, в которой промежуточные значения (результаты всех подвыражений, а также переменные) помещаются в стек до конца функции. Простые компиляторы и виртуальные машины, такие как HLVM и .NET в Windows Phone 7, фактически работают на практике так, даже если это сохраняет ссылки дольше, чем необходимо. В этой модели каждый new A()
помещает ссылку в стек до тех пор, пока функция не вернется, чтобы все три были доступны из стека в рассматриваемой точке и, следовательно, ничто не подходит для сбора мусора.
Рассмотрим модель, в которой ссылки удаляются из стека в первой точке, откуда они никогда больше не читаются. Это ближе к тому, как работают производственные виртуальные машины, такие как .NET и OCaml, за исключением того, что они по возможности сохраняют локальные ссылки в регистрах и перенаправляют на заранее выделенные записи в кадре стека вызова функции, перезаписывая мертвые локальные объекты, чтобы минимизировать размер кадра стека. В этой модели все ссылки мертвы в рассматриваемом вопросе, поэтому ни одна из них не достижима, и поэтому все три вновь выделенных объекта имеют право на сборку мусора, а также массив args
и все строки, на которые он ссылается.
Таким образом, мы не только показали, что ответы в диапазоне от nothing
до everything
могут быть оправданы, но мы даже привели действительные виртуальные машины и сборщики мусора, которые реализуют эти модели, поэтому наши прогнозы проверяемы.
Если бы мне дали этот вопрос в интервью, я бы проверил интервьюера, объяснив кое-что из этого. Если бы они хорошо отреагировали, выразив заинтересованность в обучении, я все равно был бы заинтересован в работе. Если бы они отреагировали плохо, пытаясь защитить свои плохо определенные предположения и непроверяемые прогнозы, я бы не хотел с ними работать.