Какой класс в JDK создает JRMI ProtocolAck? - PullRequest
0 голосов
/ 26 февраля 2020

Некоторые из моих (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?

1 Ответ

0 голосов
/ 02 марта 2020

sun.rmi.transport.TransportConstants определяет определение протокола

https://github.com/openjdk-mirror/jdk7u-jdk/blob/master/src/share/classes/sun/rmi/transport/TransportConstants.java

Это затем используется sun.rmi.transport.tcp.TCPTransport

https://github.com/openjdk-mirror/jdk7u-jdk/blob/master/src/share/classes/sun/rmi/transport/tcp/TCPTransport.java

и sun.rmi.transport.tcp.TCPChannel

https://github.com/openjdk-mirror/jdk7u-jdk/blob/master/src/share/classes/sun/rmi/transport/tcp/TCPChannel.java

ProtocolAck отправляется в классе TCPTransport здесь

...