Некоторые из моих (Java 7) вызовов RMI выполнялись дольше, чем ожидалось.
Когда я проверяю захват пакета с помощью Wireshark, я вижу следующее:
client → server TCP [SYN, ECN, CWR] Seq=0 Win=8192 Len=0 MSS=1460 WS=256 SACK_PERM=1
server → client TCP [SYN, ACK] Seq=0 Ack=1 Win=29200 Len=0 MSS=1460 SACK_PERM=1 WS=512
client → server TCP [ACK] Seq=1 Ack=1 Win=2102272 Len=0
client → server RMI JRMI, Version: 2, StreamProtocol
server → client TCP [ACK] Seq=1 Ack=8 Win=29696 Len=0
server → client RMI JRMI, ProtocolAck
client → server RMI Continuation
server → client TCP [ACK] Seq=21 Ack=27 Win=29696 Len=0
client → server RMI JRMI, Call
К вашему сведению: «JRMI» - это просто текст, который Wireshark использует для декодирования протокола.
Фактическое определение протокола: https://docs.oracle.com/javase/7/docs/platform/rmi/spec/rmi-protocol3.html
Задержка появляется при server → client RMI JRMI, ProtocolAck
(~ 3,5 с) до фактического RMI выполняется вызов.
Большинство ProtocolAck в захвате пакета занимает микросекунды.
Это заставляет меня думать, что это не имеет ничего общего с моим кодом как таковым, но что-то со средой выполнения или инфраструктурой.
К вашему сведению: в это время не было основной G C, а младшая G C занимала 97 мс, но она работает параллельно и не останавливает мир.
Я пытаюсь определить, что могло вызвать эту задержку в ProtocolAck.
Какие классы в JDK отвечают за ProtocolAck?