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

Почему JVM разработан таким образом, что он не позволяет принудительно собирать мусор?

Насколько я знаю, мы не можем заставить сбор мусора в JAVA. Лучшее, что мы можем сделать, это отправить запрос, вызвав System.gc() или Runtime.gc(). Это отправит запрос на сбор мусора в JVM, но не гарантирует, что сбор мусора произойдет. Поэтому мой вопрос: существуют ли какие-либо конкретные причины, WHY JVM спроектирован таким образом, что он не поддерживает сборку Force Garbage Collection?

4b9b3361

Ответ 1

Принудительная сборка мусора неэффективна и не нужна в большинстве случаев 1... если вы правильно написали свою программу.

Ссылка:

Оказывается, если вы управляете запуском JVM, который будет запускать ваше приложение (или апплет или сервлет или что-то еще), вы можете гарантировать, что вызов System.gc() будет запускать GC. Или, по крайней мере, так обстоит дело с Sun/Oracle JVM... где поведение контролируется с помощью опции -XX в команде java.

То, что делает javadoc, это то, что это зависит от платформы, и переносное приложение не может полагаться на него.


Что касается вашего вопроса:

ПОЧЕМУ JVM разработан таким образом, что он не поддерживает сборку Force Garbage Collection?

Так что JVM может быть защищен от воздействия производительности плохо написанного кода; например в апплетах, плагинах, сторонних библиотеках и т.д.

(И я полагаю, отчасти потому, что оригинальные инженеры Sun немного устали от людей, жалующихся на то, что "Java медленный", когда реальной проблемой были ненужные вызовы System.gc()...)


1 - Но не всегда. Например, вызов System.gc() в удобное время может быть способом избежать связанной с GC паузы в неудобное время. Однако, если ваш код работает только в том случае, если вы запускаете GC в определенных точках, то вы делаете что-то неправильно.

Ответ 2

Java разработан таким образом, что (в отличие от С++) вам не нужно беспокоиться о том, чтобы восстановить забытую память. Если память времени выполнения настроена правильно, вам не нужно заботиться о сборе мусора. Сказав, что выполнение gc() обычно вызывает развертку пространства молодого поколения.