Arrays.fill на G1GC оказался в 265 раз медленнее: расследование до одной машинной инструкции
Why is Arrays.fill 265 times slower on G1GC?
Бенчмарк, который должен был быть скучным, выявил аномалию: заполнение массива ссылками на G1GC занимает 139 мс против 0,5 мс на ParallelGC — при том, что во время замера не происходит ни аллокаций, ни сборок мусора. Автор прослеживает причину до сгенерированного JIT-кода и обнаруживает, что G1 вставляет в цикл write barrier с полным memory fence, который в данном случае не может быть оптимизирован. Разбор ассемблера ARM64 и объяснение, почему три «запасных выхода» барьера не срабатывают, приводят к выводу о том, что проблема не в архитектуре, а в алгоритме.
139 миллисекунд против 0,5 миллисекунды. Тот же Java-код, тот же JDK, та же машина. G1 в 265 раз медленнее.