(строки, числа, true и false, …). Работа программы — посылка сообщений. Любое сообщение может быть послано любому объекту. • Всё доступно для изменения (без остановки, компиляции и перезапуска). • Динамическая типизация. • Сборка мусора. Байт-код.
значение, но и класс объекта! • Объект «класс» (синглтон) принадлежит классу «метакласс». В этом объекте хранятся все свойства класса (имена переменных, методы, ссылка на родительский класс…)
объявлен ли метод в классе (Obj class). Если нет, ищем объект в родительском (суперклассе) и т.д. по всей иерархии до самого Object. • Если ничего не найдено, посылаем специальное сообщение MessageNotUnderstood. • Вся система полностью динамическая. В любой момент можно изменить или добавить метод у любого класса!
• Вызов GC часто происходит в непредсказуемый момент и длится непредсказуемое время. • По оценке, требуется в 5 раз больше памяти, чтобы программа работала примерно с той же скоростью, что и при ручном управлении памятью.
• Шаг 1 (Mark). Отталкиваясь от «корней» (переменные в стеке, глобальные объекты), идём по ссылкам и помечаем объекты как используемые (true). • Шаг 2 (Sweep). Сканируем всю память, ищем непомеченные объекты и освобождаем их, а у помеченных сбрасываем флаг в false. • Недостатки: • На время исполнения вся система должна замереть. • Нужно прочесать всю память, что создаёт нагрузку на подсистему виртуальной памяти в ОС.
Чёрный список. Объекты, до которых можно добраться от «корней» и у которых нет ссылок на объекты из белого списка. • Серый список. Объекты, достижимые от «корней», но про которые неизвестно, содержат ли они ссылки на объекты из белого списка. • Алгоритм: • Выбрать объект из серого списка и переместить его в чёрный, пометив все белые объекты, на которые он ссылается, серым. Повторять, пока серый список не опустеет. • Удалить все объекты из белого списка.
сразу. • Легко реализуется. • Производительность системы слабо зависит от количества свободной памяти. • Недостатки: • Слишком частые обновления. • Проблема циклических ссылок. • Нельзя перемещать объекты.
• Более 90 % освобождаемых объектов возникает со времени прошлого цикла GC. • Если объект пережил GC, скорее всего, он вряд ли будет освобожден. • Разделяем объекты по поколениям.