
Комментарии 8
Моделью памяти в языке Java называется совершенно другая вещь, а именно фрагмент спецификации языка Java, $17.4 JLS.
Более того, насколько я помню, с точки зрения стандарта Java SE 8 (7, 6, 5 и др.), GC нет ни в спецификации языка, ни в спецификации виртуальной машины. Он есть только в библиотеке классов в виде
System.gc() и Runtime.gc().Кажется, здесь «пропускная способность» фактически определяется как отношение времени работы приложения к суммарному времени stop-the-world-пауз. Для сборщиков, у которых основная работа выполняется в STW-фазах, это может быть полезным приближением, но для concurrent GC такая оценка уже не характеризует фактическую производительность приложения.
В предельном случае сборщика без глобальных STW-фаз — Azul C4 можно считать близким практическим приближением, — суммарное время пауз стремится к нулю, а значение метрики неограниченно растёт. Реальный throughput при этом остаётся конечным и может снижаться из-за накладных расходов: служебного кода GC при чтении и записи ссылок (GC barriers), конкуренции за CPU, кэши и пропускную способность памяти, а также приостановок потоков при выделении памяти.
Поэтому throughput, вероятно, точнее измерять как объём полезной работы за единицу wall-clock-времени при заданных ограничениях по CPU и памяти, а характеристики пауз и потребление ресурсов учитывать отдельно.
Дюк, вынеси мусор! — 1. Введение