Зачем нужен g c и можем ли мы писать на языке без этого, кроме безопасности памяти? - PullRequest
0 голосов
/ 16 февраля 2020

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

1 Ответ

1 голос
/ 01 марта 2020

Расчет времени жизни объекта (во время компиляции или во время выполнения) недостаточно эффективен, чтобы его можно было использовать без (отслеживания) сборщика мусора. Escape-анализ - это известный метод, позволяющий найти область действия определенных указателей объекта и, таким образом, автоматически вставить свободный оператор, когда объект больше не используется. Например, в Java это выполняется JIT-компилятором виртуальной машины * HotSpot , поскольку нет инструкций для освобождения памяти с помощью байт-кода, это невозможно сделать во время компиляции (без использования нестандартных инструкций с байт-кодом), Я думаю, что это также то же самое для Javascript.

Анализ побега и другие подобные алгоритмы полезны для снижения давления G C, однако они не могут использоваться только сами по себе. Представьте себе (оптимальный сценарий), что экранирующий анализ может обнаружить 40% выделений в программе, без G C 60% выделений не будут возвращены, и, таким образом, программе в конечном итоге не хватит памяти. Что касается нахождения времени жизни (области действия) всех объектов, это невозможно, простой (Java) пример будет следующим:

public Object getFriendIfOnline(String name) {
   Object friend = Server.requestFriendObject(name);
   if(friend.isOnline()) {
     return friend;
   } else {
     return null;
   }
}

Невозможно узнать, является ли время компиляции дружественным объектом будут возвращены (и останутся живыми) или будут сброшены (и не будут использованы). Если вы все равно освободите объект, это приведет к преждевременному освобождению и поломке вашей программы.

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

...