Подтвердить что ты не робот

Как уничтожить объект в java?

Я столкнулся с этим вопросом в интервью со следующими вариантами:

Как уничтожить объект в java?

a. System.gc();  
b. Runtime.getRuntime.gc();  
c. object.delete();  
d. object.finalize();  
e. Java performs gc by itself, no need to do it manually.
  • Ответ должен быть e?

  • что, если e не было? тогда? ясно c не ответ. a и b будут делать gc для всего приложения (вопрос требует для одного объекта). Я думаю, что это d, потому что finalize() вызывается непосредственно перед gc (но необходимо ли после завершения gc вызывать?) Или я ошибаюсь? e должен быть там, чтобы ответить на этот вопрос?

4b9b3361

Ответ 1

Ответ E - правильный ответ. Если E нет, вы скоро исчерпаете память (или) Нет правильного ответа.

Объект должен быть недоступен для получения GC. JVM будет выполнять множественные проверки и перемещать объекты из поколения в поколение, чтобы определить приемлемость GC и освобождает память, когда объекты недоступны.

Ответ 2

Чтобы выяснить, почему другие ответы не могут работать:

  • System.gc() (вместе с Runtime.getRuntime().gc(), который делает то же самое) намекает, что вы хотите уничтожить вещи. Смутно. JVM может игнорировать запросы на запуск цикла GC, если он не видит необходимости в нем. Кроме того, если вы не обманули все доступные ссылки на объект, GC все равно не коснется его. Таким образом, A и B оба дисквалифицированы.

  • Runtime.getRuntime.gc() - плохая грамматика. getRuntime - это функция, а не переменная; вам понадобится скобки после его вызова. Таким образом, B дважды дисквалифицирован.

  • Object не имеет метода delete. Таким образом, C дисквалифицирован.

  • Хотя Object имеет метод finalize, он ничего не уничтожает. Только сборщик мусора может фактически удалить объект. (И во многих случаях они технически даже не потрудились это сделать, они просто не копируют его, когда делают другие, поэтому он получает остался позади.) Все finalize действительно дает объекту возможность очистить до того, как JVM отменит его. Что еще, вы никогда не должны называть finalize напрямую. (Поскольку finalize защищен, JVM не позволит вам вызывать его на произвольном объекте в любом случае.) Таким образом, D дисквалифицирован.

  • Кроме того, object.doAnythingAtAllEvenCommitSuicide() требует, чтобы исполняемый код имел ссылку на Object. Это само по себе делает его "живым" и, следовательно, неприемлемым для сбора мусора. Таким образом, C и D являются двойными дисквалификациями.

Ответ 3

Краткий ответ - E

Ответ E, учитывая, что остальные явно неверны, но..

Длительный ответ - это не так просто; это зависит...

Простым фактом является то, что сборщик мусора никогда не может решить собрать мусор каждый объект, который является жизнеспособным кандидатом для сбора, если только давление памяти не будет чрезвычайно высоким. И тогда есть тот факт, что Java так же восприимчив к утечкам памяти, как и любой другой язык, их просто сложнее вызвать, и поэтому их сложнее найти, когда вы их вызываете!

В следующей статье есть много хороших подробностей о том, как управление памятью работает и не работает, и что происходит от чего. Как работают коллекторы коллекций мусора, и Спасибо за память (Понимание того, как использует JVM Родная память в Windows и Linux)

Если вы прочтете ссылки, я думаю, вы поймете, что управление памятью на Java не так просто, как вопрос с несколькими вариантами выбора.

Ответ 4

Установите значение null. Тогда больше нет ссылок, и объект станет готовым к сборке мусора. GC автоматически удалит объект из кучи.

Ответ 5

Вот код:

public static void main(String argso[]) {
int big_array[] = new int[100000];

// Do some computations with big_array and get a result. 
int result = compute(big_array);

// We no longer need big_array. It will get garbage collected when there
// are no more references to it. Since big_array is a local variable,
// it refers to the array until this method returns. But this method
// doesn't return. So we've got to explicitly get rid of the reference
// ourselves, so the garbage collector knows it can reclaim the array. 
big_array = null;

// Loop forever, handling the user input
for(;;) handle_input(result);
}

Ответ 6

В java нет явного способа сбора мусора. Сама JVM запускает некоторые потоки в фоновом режиме для проверки объектов, которые не имеют ссылок, что означает, что все пути, по которым мы обращаемся к объекту, теряются. С другой стороны, объект также имеет право на сбор мусора, если у него заканчивается область действия, которая является программой, в которой мы создали объект, заканчивается или заканчивается.    Подойдя к вашему вопросу, метод finalize аналогичен деструктору в С++. Метод finalize фактически вызывается непосредственно перед моментом освобождения памяти объекта от JVM. Это зависит от вас, чтобы определить метод finalize или нет в вашей программе. Однако, если сборка мусора объекта выполняется после завершения программы, JVM не будет вызывать метод finalize, который вы определили в своей программе.   Вы можете спросить, что такое метод finalize?  Например, рассмотрим, что вы создали объект, который требует некоторого поток к внешнему файлу, и вы явно определили метод finalize для этого объекта, который проверяет поток, открытый в файл, или нет, и если он не закрывает поток. Предположим, после написания нескольких строк кода вы потеряли ссылку на объект. Затем он имеет право на сбор мусора. Когда JVM собирается освободить пространство вашего объекта, JVM просто проверит, определил ли вы метод finalize или нет и вызывает метод, поэтому нет риска открытого потока. окончательный метод делает программу свободной и более надежной.