SecurityManager が逆引き DNS ルックアップを行うため、サンドボックス化された Java アプレットに問題があります。他の質問を参照してください。
しかし、根本的な問題は、リバース DNS ルックアップに約 4.5 秒かかることです (ドメイン結果なし)。問題は、結果が見つからないことではなく (その場合は IP を返します)、単に時間がかかるという事実です。
この問題は SecurityManager からも独立しています。これが実行されている間、Permissions クラスがロックを保持し、他の多くのスレッドを 4.5 (またはそれ以上) 秒間フリーズさせるため、そこでのみ問題になります。
4.5 秒かからないドメイン名の結果 (つまり、IP を返す) を持たないドメインもあります。たとえば、「staminus.net」。
SSCCE:
String host = "random.org";
// "random.org" - IP result, takes 4.5 seconds
// "cdn.knuddelscom.de" - IP result, takes 4.5 seconds
// "staminus.net" - IP result, fast
// "google.com" - domain result: fra15s11-in-f14.1e100.net, fast
InetAddress addr = Inet4Address.getByName(host);
for (int i = 0; i < 100; i++)
{
long start = System.currentTimeMillis();
String hostName = Inet4Address.getByAddress(addr.getAddress()).getHostName();
long end = System.currentTimeMillis();
System.out.println((i + 1) + " RDNS " + host + " ... (" + (end - start) + "ms): " + hostName);
}
(Java JDK 1.8.0_40 でテスト済み)
Sysinternals Process Explorer を使用して、ハングしているスレッドの Windows API 呼び出しスレッド ダンプを作成しましたが、何が起こっているのかを知るには十分ではありません。
ntoskrnl.exe!KeSynchronizeExecution+0x2246
ntoskrnl.exe!KeWaitForMultipleObjects+0x135e
ntoskrnl.exe!KeWaitForMultipleObjects+0xdd9
ntoskrnl.exe!KeWaitForSingleObject+0x373
ntoskrnl.exe!KeReleaseSemaphore+0xd33
ntoskrnl.exe!NtSetEvent+0xf99
ntoskrnl.exe!NtSetEvent+0x447
ntoskrnl.exe!RtlEqualUnicodeString+0x9ae
ntoskrnl.exe!setjmpex+0x34a3
ntdll.dll!ZwAlpcSendWaitReceivePort+0xa
RPCRT4.dll!NDRCContextBinding+0x6c8
RPCRT4.dll!NdrClientCall3+0xded
RPCRT4.dll!NdrClientCall3+0xfe
DNSAPI.dll!AddRefQueryBlobEx+0x753
DNSAPI.dll!DnsValidateName_W+0x1312
DNSAPI.dll!DnsQueryEx+0x103
mswsock.dll!Tcpip4_WSHOpenSocket2+0x1578
mswsock.dll!Tcpip4_WSHOpenSocket2+0x141e
mswsock.dll!Tcpip4_WSHOpenSocket2+0x1252
WS2_32.dll!WSALookupServiceNextW+0x1d8
WS2_32.dll!WSALookupServiceNextW+0xa3
WS2_32.dll!GetHostNameW+0x2e44
WS2_32.dll!GetHostNameW+0x1130
WS2_32.dll!getnameinfo+0xaf
net.dll!Java_java_net_Inet6AddressImpl_getHostByAddr+0x124
常に約 4.5 秒なので、タイムアウトのように見えます。したがって、この説明は論理的です。(R)DNS サーバーは要求に応答しません。
これをどのようにテストできますか?
どうすればこれを修正できますか?