Я тестирую API, написанный на Java, который, как ожидается, минимизирует задержку при обработке сообщений, полученных по сети. Для достижения этих целей я играю с различными сборщиками мусора, которые доступны.
Я пытаюсь использовать четыре разных метода, которые используют следующие флаги для управления сборкой мусора:
1) Серийный номер: -XX: + UseSerialGC
2) Параллель: -XX: + UseParallelOldGC
3) Параметр: -XX: + UseConcMarkSweepGC
4) Параллельный/инкрементный: -XX: + UseConcMarkSweepGC -XX: + CMSIncrementalMode -XX: + CMSIncrementalPacing
Я провел каждую технику в течение пяти часов. Я периодически использовал список GarbageCollectorMXBean, предоставленный ManagementFactory.getGarbageCollectorMXBeans(), чтобы получить общее время, затрачиваемое на сбор мусора.
Мои результаты? Обратите внимание, что "латентность" здесь "Количество времени, которое мое приложение + API потратил на обработку каждого сообщения, вырванного из сети".
Последовательность: 789 событий GC на общую сумму 1309 мс; средняя латентность 47,45 us, средняя латентность 8,704 us, максимальная латентность 1197 us
Параллель: 1715 событий GC на общую сумму 122518 мс; средняя латентность 450,8 us, средняя латентность 8,448 us, максимальная латентность 8292 us
Параллельный: 4629 событий GC на общую сумму 116229 мс; средняя латентность 707,2 us, средняя латентность 9,216 us, максимальная латентность 9151 us
Инкрементность: 5066 событий GC на общую сумму 200213 мс; средняя латентность 515,9 us, средняя латентность 9,472 us, максимальная латентность 14209 us
Я считаю, что эти результаты настолько невероятны, что они граничат с абсурдом. Кто-нибудь знает, почему у меня могут быть такие результаты?
О, и для записи я использую 64-разрядную виртуальную машину Java HotSpot TM.