Сборка "мусора" Java

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

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

5
задан Pieter van Niekerk 26 May 2010 в 05:19
поделиться

6 ответов

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

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

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

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

Де-факто ссылкой на эту тему является книга Garbage Collection, которая хорошо написана и всеобъемлюща.

5
ответ дан 18 December 2019 в 13:11
поделиться

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

1
ответ дан 18 December 2019 в 13:11
поделиться

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

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


Объяснение

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

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

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

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

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

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

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

4
ответ дан 18 December 2019 в 13:11
поделиться

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

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

1
ответ дан 18 December 2019 в 13:11
поделиться

Для .NET посмотрите Garbage Collector Basics and Performance Hints Там вы также найдете несколько советов по производительности.

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

1
ответ дан 18 December 2019 в 13:11
поделиться

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

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

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

2
ответ дан 18 December 2019 в 13:11
поделиться