Я проходил собеседование и интервьювер задал вопрос, можно ли убить GC в Java. На дополнительный вопрос, должно ли жить приложение он ответил, да должно. Я сказал, что без пересобирания JDK это сделать нельзя, точнее какие-то догадки я построил, но чтобы приложение работало, я не знаю как это сделать. Интервьювер сказал, что можно и что нужно загуглить, в гугл ничего такого не нашел, пожалуйста подскажите.
Ответ
No. You cannot kill a GC programmatically. The interviewer is
expecting some answer like:
The garbage collection cannot be forced. The garbage collector runs in
low memory situations. When it runs, it releases the memory allocated
by an unreachable object. The garbage collector runs on a low priority
daemon (background) thread. You can nicely ask the garbage collector
to collect garbage by calling System.gc() but you can�t force it.
Note: The only way you kill a GC is when you exit your application.
System.exit();
Нет. Вы не можете убить GC из кода. Интервьюер ждал ответ типо такого:
GC не возможно остановить. Он начинает работу когда остается мало памяти. Начиная работать он освобождает память от забытых (недостежимых, тех на которые не осталось ссылок) объектов. GC работает в потоке демона с низким приоритетом. Единственное, что вы можете - попросите его собрать мусор вызовом System.gc(), но остановить вы его не можете.
p.s. Хотя можете, используя одну секретную команду от гуру-разработки System.exit();
исходник
Это единственное, что смог найти.
IMHO:
GC включается когда остается мало память. Если программа не использует всю память, то он не начнет работать, можно сказать, что он мертв, но это не так. А если все такие его неведомым образом убить, то узнаете вы это по OutOfMemoryError и приложение остановится
По следам идеи @ViacheslavVedenin, что будет с GC если в finalize
остановить нить GC
навечно зациклить нить GC
бросить exception
По докам написал сам @ViacheslavVedenin, а я решил пойти путем экспериментов. И никакой разницы.
лог нормальной работы
лог с Thread.currentThread().stop(); в finalize
лог с while(true);
лог с throw new RuntimeException(); в finalize
Если честно то особой разницы я не заметил, так, что думаю GC создавая новую нить для finalize не особо о ней заботиться и не следит. Когда она закончит работу объект будет удален. Причина по который нить завершиться его не волнуют, раз завершилась значит сделала все, что могла.
Добавлю так же ответы товарища @Suvitruf, чтобы заметнее были:
GC можно отключить
Гуглить по словам "Шипилёв", "GC без GC"
статья на jug.ru
статья на хабре
Комментариев нет:
Отправить комментарий