GC (сборка мусора) должен остановить мир?

Go

GC (сборка мусора) должен остановить мир?

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

Но сборщик мусора также имеет свою стоимость, которая повлияет на эффективность программы. Сборщик мусора — очень сложная работа, и многие ученые-компьютерщики потратили на нее десятилетия, чтобы постоянно повышать эффективность.

При разработке алгоритма GC будут учитываться несколько важных показателей:

  • Пропускная способность программы: влияние GC на эффективность программы, то есть соотношение времени, затрачиваемого на GC, и времени, затрачиваемого программой на выполнение обычных операций;
  • Пропускная способность сборщика мусора: количество сборок мусора в единицу времени;
  • Время паузы: время остановки мира;
  • Параллелизм: как механизм сборки мусора использует несколько ядер;
  • подожди есть еще много

Многие спрашивают, почему вся программа останавливается (Stop-the-world) во время сборки мусора и почему сборка мусора не может выполняться одновременно? GC по сути является компромиссом, Stop-the-world предназначен для пропускной способности GC (сколько мусора может быть удалено сборщиком за заданное время ЦП?), это не означает, что GC должен STW, вы также можете уменьшить скорость работы, но алгоритмы сбора, которые могут выполняться одновременно, в зависимости от вашего бизнеса.

В J9VMстадия маркировкиЕсть описания, а теги делятся на:

  • Параллельная маркировка
      并行标记的目的是在不降低单处理器系统上标记性能的情况下,提高多处理器系统上典型标记的性能。
    
      通过增加共享使用工作包池的助手线程,可以提高对象标记的性能。例如,可选取由一个线程返回给池的完整输出包作为另一个线程的新输入包。
    
      并行标记仍需要一个用作主协调代理进程的应用程序线程的参与。助手线程帮助标识回收的根指针并跟踪这些根。标记位是使用不需要附加锁的主机原子原语来更新的
    
  • одновременная маркировка
      在堆大小增加时,并发标记能够提供缩短且一致的垃圾回收暂停时间。
    
      在堆满之前,GC 将启动并发标记阶段。在并发阶段,GC 扫描堆,检查根对象,比如堆栈、JNI 引用和类静态字段。通过要求每个线程扫描自己的堆栈来扫描堆栈。随后,这些根将用于并发跟踪活动对象。在线程执行堆锁分配时,跟踪由低优先级的后台线程和每个应用程序线程执行。
    
      当 GC 利用正在运行的应用程序线程并发标记活动对象时,必须记录对已跟踪对象的任何更改。它使用在每次更新对象中的引用时运行的写屏障。在发生对象引用更新时,写屏障将使用标志。使用该标志迫使对部分堆重新扫描。
    

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

Последним компромиссом между двумя типами алгоритмов является эффективность GC: отношение времени работы программы ко времени выполнения сбора.

Ни один алгоритм не идеален во всех отношениях, и язык не может знать бизнес-тип программы, поэтому существует «настройка GC». Это также основной закон науки.