Сборка мусора Java - PullRequest
5 голосов
/ 26 мая 2010

Мне было интересно о сборке мусора, которая происходит на Java. Действительно ли он способен обрабатывать все неиспользуемые объекты и высвобождать максимально возможную память?

Я также хочу знать, как Java-сборка мусора сравнивается с другим языком, например, скажем, C #? И затем, как соотносится автоматический сбор мусора с ручным сбором с языка, подобного C?

Ответы [ 6 ]

5 голосов
/ 26 мая 2010

Да, это и есть точка сбора мусора.

Существует много разных форм сборки мусора. Простейшая форма подсчета ссылок не может обрабатывать определенный тип мусора (циклические ссылки) без улучшения алгоритма.

Java (Sun JVM) использует марку поколения и сборщик развертки, хотя это не стандартизировано, и разные JVM используют разные сборщики. Я не знаю точный коллектор, используемый .NET CLR.

Сборщики мусора, такие как сокращение нагрузки на программиста, могут повысить эффективность работы некоторых алгоритмов. Тем не менее, их объем памяти, как правило, больше, чем жесткая система ручного распределения.

Дефактным справочником по этой теме является книга «Сборка мусора» , которая хорошо написана и понятна.

4 голосов
/ 26 мая 2010

Действительно ли он способен обрабатывать все неиспользуемые объекты

Нет, не может. Однако он может собирать все объекты, которые больше нельзя использовать , и делает это очень хорошо. Разница тонкая, см. Ниже.


Объяснение

Например, скажем, у вас есть следующий код:

class A {
    public static Date d = new Date(); // d will never be collected
}

И скажем, вы знаете, что через некоторое время к 1017 * больше никогда не будет доступа. Однако во время выполнения система не имеет этой информации, и d будет сохраняться в течение неопределенного времени, в то время как в C ++ вы можете явно удалить ее.

Вместо этого сборщик мусора собирает все объекты , которые больше не доступны . Например:

void f() {
    Date d = new Date();
    System.out.println(d.toString());
} // d is no longer accessible at this point

Сборщик мусора обнаруживает, что объект, на который ссылается d, никогда не будет снова доступен, поскольку d является его единственной ссылкой и выходит из области видимости в конце метода. Сбор недоступных объектов - это недооценка вопроса «какие объекты могут быть собраны», но он безопасен, поскольку гарантирует, что живой объект никогда не будет собран.

Разница тонкая, и действительно, в самом здравом коде будут собраны все объекты, которые вы больше не используете. Эта коллекция сама по себе завершена, способна правильно идентифицировать и собрать каждый недоступный объект , и включает в себя объекты, которые недоступны, поскольку все их ссылки находятся в других недоступных объектах.

2 голосов
/ 27 мая 2010

Сборщики мусора ищут объекты и проверяют, ссылаются ли на них действительные указатели. Если нет, они полностью удалены. Это устраняет потенциальные проблемы, такие как наличие живых указателей, ссылающихся на мертвые объекты, и, следовательно, застревание в памяти, ничего не делая.

Использование языка, который требует от вас выделения, освобождения и перераспределения пространства самостоятельно (например, C), может быть очень сложным для начала, поскольку вы должны полностью контролировать выделение пространства для любого объекта, который вам нужен -распределение любого объекта, с которым вы закончили, не забывая ни о каких ненужных объектах, сидящих где-то, занимающих место. Как бы это ни было сложно, у него есть преимущество в производительности.

Сборщики мусора, как правило, выделяют пространство на низком уровне, что может снизить производительность. Однако для большинства приложений снижение производительности не будет значительным и, следовательно, не заметным.

1 голос
/ 27 мая 2010

Для .NET взгляните на Основы сборщика мусора и советы по производительности Там вы также найдете несколько советов по производительности.

Для Java, посмотрите на Теория и практика Java: сборка мусора и производительность . Там также вы найдете несколько подсказок и «анти-подсказок», то есть способов сделать GC хуже.

1 голос
/ 26 мая 2010

Сборщик мусора (GC) время от времени запускает поиск ссылок на объекты. Те, у кого нет ссылок, помечаются первыми, и вызывается метод finalize (). В следующий раз объекты будут удалены из памяти. GC делает программы немного медленными. Вы можете влиять на поведение GC, но нет никакой гарантии.

1 голос
/ 26 мая 2010

Сборщик мусора определяется реализацией. Существуют разные типы GC; какой из них используется, программам не о чем беспокоиться.

Я не могу сказать о C, но в C ++ мы на самом деле очень редко используем полноценный сборщик мусора, потому что программисты C ++ имеют такие методы, как RAII и умные указатели подсчета ссылок, которые помогают упростить управление памятью.

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