Стандартная Java-сериализация создает много мусора.Если вы видите всплески во времени, чтобы выполнить это, то это будет потому, что а) он ожидает ввода-вывода (который может быть любым количеством времени) или б) выполняет вспомогательный или полный GC.
Я бы запустилваше приложение с
-verbosegc
, чтобы увидеть, когда выполняется полный сбор данных.В противном случае вы можете использовать jstat
jstat -gccause 5s {process-id}
Большинство коллекций - «остановка мира», поэтому, когда выполняется сборщик мусора, readObject, по-видимому, использует большое количество ЦП, хотя на самом деле это былоожидание, пока GC очистит некоторые данные.
При профилировании вашего приложения я предлагаю включить профилирование памяти.
Тем не менее, чтобы иметь такие задержки, вы должны де сериализовать много данных.,Чтобы получить задержку 3 с, обычно требуется около 3 ГБ мусора.Если это один на 20 запросов, каждый запрос может составлять в среднем 150 МБ мусора.
Возможно, пришло время оптимизировать вашу сериализацию.Вы можете получить это почти ничего, но требуется больше и больше работы, чтобы сделать это, чем ниже вы идете.Я бы начал с реализации readObject / writeObject как его самого простого изменения, которое могло бы дать вам наибольшую выгоду.