Я тестирую 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 мкс, медианная задержка 8,704 мкс, максимальная задержка 1197 мкс
Параллельно: события 1715 GC на общую сумму 122518 мс;средняя задержка 450,8 мкс, средняя задержка 8,448 мкс, максимальная задержка 8292 мкс
Одновременно: 4629 событий GC на общую сумму 116229 мс;средняя задержка 707,2 мкс, средняя латентность 9,216 мкс, максимальная задержка 9151 мкс
Инкремент: 5066 событий GC на общую сумму 200213 мс;средняя задержка 515,9 мкс, средняя задержка 9,472 мкс, максимальная задержка 14209 мкс
Я считаю эти результаты настолько невероятными, что они граничат с абсурдом.Кто-нибудь знает, почему у меня могут быть такие результаты?
О, и для записи, я использую Java HotSpot (TM) 64-битный сервер VM.