Теорія і практика Java Коротка історія розвитку технології утилізації памяті

March 19th, 2009


« Java протистоїть новому поколінню динамічних мов   |   Як починалася революція Інтернет частина 2 »

Копіюючий алгоритм має прекрасні робочі характеристики, але його основним недоліком є потреба в об’ємі пам’яті більшому в два рази, чим об’єм, необхідний для маркирующе-зачищаючого складальника сміття. Алгоритм маркіровки-стиснення поєднує маркіровку-зачистку і копіювання таким чином, що ця проблема зникає за рахунок того, що процес збірки сміття ускладнюється.
Як і маркіровка-зачистка, маркіровка-стиснення складається з двох фаз. У фазі маркіровки кожен об’єкт, що діє, розглядається і маркірується. Потім маркіровані об’єкти копіюються таким чином, що всі об’єкти, що діють, ущільнюються в самому низу динамічної пам’яті.
Якщо повне стиснення здійснюється при кожній збірці сміття, отримана в результаті динамічна пам’ять така ж як і результат роботи копіюючого складальника - між активною частиною динамічної пам’яті і вільною існує чітка межа, так що витрати на розміщення порівнянні з витратами при використанні копіюючого складальника сміття.
Довгоживучі об’єкти мають тенденцію накопичуватися в самому низу динамічної пам’яті, тому вони не копіюються циклічно, як при використанні копіюючого складальника сміття.

Отже, якій вибрати?

Добре, який же з цих підходів використовується в інструментальному пакеті JDK для збірки сміття? У якомусь сенсі все з них. У попередніх пакетах JDK використовувався однопотоковий маркирующе-зачищаючий або маркирующе-зачищающе-стискаючий складальник.
У JDK 1.2 і пізніших версіях застосовується змішаний підхід, який називається збірка сміття по поколіннях , при якій динамічна пам’ять ділиться на декілька шарів відповідно до віку об’єктів, і різні покоління обробляються окремо з використанням різних алгоритмів утилізації пам’яті.


Tags: , , , , , ,

Про Java


Схожі записи

Категория: Про Java |

Комментарии