Спецификация языка Java позволяет использовать фиктивный метод gc (). Зачем? - PullRequest
5 голосов
/ 27 января 2010

Мне трудно понять следующее:

«Спецификация языка Java позволяет использовать фиктивный метод gc ()».

Почему стандарт делает это?
Это делает очень важную функцию java необязательной .
Это также означает, что моя одна и та же программа будет работать по-разному в двух разных реализациях JVM !! ! Что-то полностью противоречащее важной особенности Java: переносимость .

Ответы [ 6 ]

13 голосов
/ 27 января 2010

Это делает очень важную особенность Java необязательной.

GC не сделан необязательным для Java. Необязательным является явная сборка мусора, запускаемая вызовом gc(). И это вполне приемлемо, поскольку явный запуск сборки мусора редко необходим и мешает работе современного сборщика мусора.

6 голосов
/ 27 января 2010

Вызов метода gc предполагает, что виртуальная машина Java затрачивает усилия на утилизацию неиспользуемых объектов, чтобы сделать доступной память, которую они занимают, для быстрого повторного использования. Когда управление возвращается из вызова метода, виртуальная машина Java сделала все возможное, чтобы освободить пространство от всех отброшенных объектов.

Вызов gc() не гарантирует запуска сборки мусора. То есть Вы не можете заставить сборку мусора. Вот почему метод может быть пустым.

"Лучшее усилие", упомянутое выше, может быть "ожидалось неявного сбора мусора".

4 голосов
/ 27 января 2010

Это также будет означать мою ту же программу будет вести себя по-разному на двух различные реализации JVM !!! Что-то полностью против Java Важная особенность портативности.

Различия такого рода между различными реализациями JVM - это на самом деле хорошая вещь. Это позволяет улучшить основные детали, которые не влияют на правильность программы и обычно улучшают производительность. Сборка мусора оказывается областью, в которой спецификация JVM направлена ​​на предоставление возможности реализации возможности в основном экспериментировать с различными подходами к решению проблемы. Sun недвусмысленно заявляет, что вызов gc () не вызовет развертывание памяти, поэтому программисты не могут утверждать, что они ожидают определенного поведения от каждой JVM.

2 голосов
/ 27 января 2010

Обычно хорошей идеей является дать JVM понять, когда нужно выполнить сборку мусора, вместо того, чтобы явно сказать ей об этом. Тот факт, что спецификация Java допускает использование фиктивного метода, не меняет того факта, что Java выполняет сборку мусора, это просто означает, что он может игнорировать запросы от вас сделать это явно.

Вот хорошая (немного старая) статья о сборке мусора в Java, которая имеет короткий абзац на System.gc (): http://www.ibm.com/developerworks/library/j-jtp01274.html

2 голосов
/ 27 января 2010

Основная идея - gc () необязательна, и вы можете принудительно собирать мусор, если хотите.

Но все же у вас есть "автоматическая" сборка мусора, как и должно быть. gc () - это всего лишь вопрос повышения эффективности и эффективности программы

1 голос
/ 27 января 2010

Если ваша программа зависит от System.gc (), вам следует либо пересмотреть свой дизайн, либо перейти на другой язык программирования.
Сборка мусора может быть реализована по-разному для каждого виртуального компьютера, и один только Sun vm поставляется с несколькими различными реализациями.

Было бы интересно узнать, как ваша программа использует System.gc (). Если это для финализаторов, они идут со своими проблемами и должны использоваться только для отладки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...