ПриМеЧание
Тесты.быстродействия,.проведенные.Microsoft,.показали,.что.уборка.мусора.в.по-
колении.0.занимает.меньше.1.мс .Microsoft.стремится.к.тому,.чтобы.уборка.мусора.
занимала.не.больше.времени,.чем.обслуживание.обычной.страничной.ошибки
1
Когда JIT-компилятор создает машинный код, модифицирующий ссылочное поле внутри
объекта, туда входит вызов барьерного метода записи (write barrier method). Этот метод про-
веряет, принадлежит ли объект, поля которого изменяются, к поколению 1 или 2. В случае
положительного результата код барьерного метода записи устанавливает бит во внутренней
таблице (card table). Эта таблица содержит по одному биту для каждого 128-байтного диа-
пазона данных в куче. В начале следующего цикла сборки мусора из таблицы определяется,
поля каких объектов поколений 1 и 2 изменились с момента прошедшей сборки. Если какой-то
из этих объектов ссылается на объект поколения 0, этот объект переживает уборку мусора.
После завершения процедуры всем полям таблицы возвращаются нулевые значения. Наличие
кода барьерного метода записи негативно сказывается на производительности при записи
ссылочных полей у объекта (в отличие от локальных переменных или статических полей).
Производительность падает еще больше, если объект принадлежит поколению 1 или 2.
565
Поколения
Уборщик мусора с поддержкой поколений также предполагает, что объекты,
прожившие достаточно долго, продолжат жить и дальше. Так что велика вероят-
ность, что объекты поколения 1 и впредь останутся доступными в приложении.
То есть проверив объекты поколения 1, уборщик нашел бы мало мусора и не смог
бы освободить много памяти. Следовательно, уборка мусора в поколении 1, скорее
всего, окажется пустой тратой времени. Если в поколении 1 появляется мусор, он
просто остается там. Сейчас куча выглядит, как показано на рис. 21.7.
рис. 21.7.
.Вид.кучи.после.двух.операций.уборки.мусора:.выжившие.объекты.
из.поколения.0.переходят.в.поколение.1.(увеличивая.его.размер),.
поколение.0.пустует
Как видите, все объекты из поколения 0, пережившие уборку мусора, перешли
в поколение 1. Так как уборщик не проверяет поколение 1, память, занятая объек-
том
В
, не освобождается, даже если этот объект на момент уборки мусора недоступен.
И в этот раз после уборки мусора поколение 0 пустеет, в это поколение попадут
новые объекты. Допустим, приложение работает дальше и выделяет память под
объекты
L
–
O
. Во время работы приложение прекращает использовать объекты
G
,
L
и
M
, и они становятся недоступными. В результате куча выглядит так, как по-
казано на рис. 21.8.
рис. 21.8.
.В.поколении.0.созданы.новые.объекты,.количество.мусора.
в.поколении.1.увеличилось
Допустим, в результате размещения объекта
P
размер поколения 0 превысил
пороговое значение, что инициировало уборку мусора. Поскольку все объекты
поколения 1 занимают в совокупности меньше порогового уровня, уборщик вновь
решает собрать мусор только в поколении 0, игнорируя недоступные объекты в по-
колении 1 (
B
и
G
). Куча после уборки мусора показана на рис. 21.9.
рис. 21.9.
.Вид.кучи.после.трех.операций.уборки.мусора:.выжившие.объекты.
из.поколения.0.переходят.в.поколение.1.(увеличивая.его.размер);.
поколение.0.пустеет
566
Do'stlaringiz bilan baham: |