有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么ReverseDNS/getHostName()对于某些地址来说速度非常慢?

沙盒Java小程序中存在问题,因为SecurityManager执行反向DNS查找。见other question

但潜在的问题是,反向DNS查找大约需要4.5秒(没有域结果)。问题不在于缺少的结果(在这种情况下它返回IP),而在于它花费的时间太长

这个问题也独立于SecurityManager,它只会在那里成为一个问题,因为Permissions类在运行时持有一个锁,因此会将许多其他线程冻结4.5秒(或更多)

还有一些没有域名结果(即返回IP)的域不需要4.5秒。例如“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);
}

(使用JavaJDK1.8.0(U 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服务器不响应我们的请求

我们如何测试这一点

我们如何解决这个问题


共 (0) 个答案