使用 JNDI 库执行 DNS 查询时线程挂起
Thread hangs while executing DNS query employing JNDI library
以下是从 DNS 获取 TXT 记录时线程被锁定导致的死锁
java.lang.Thread.State: RUNNABLE
at java.io.FileInputStream.readBytes(Native Method)
at java.io.FileInputStream.read(FileInputStream.java:272)
at sun.security.provider.NativePRNG$RandomIO.readFully(NativePRNG.java:202)
at sun.security.provider.NativePRNG$RandomIO.ensureBufferValid(NativePRNG.java:264)
at sun.security.provider.NativePRNG$RandomIO.implNextBytes(NativePRNG.java:278)
- locked <0x00000004f3cd17b0> (a java.lang.Object)
at sun.security.provider.NativePRNG$RandomIO.access0(NativePRNG.java:125)
at sun.security.provider.NativePRNG.engineNextBytes(NativePRNG.java:114)
at java.security.SecureRandom.nextBytes(SecureRandom.java:466)
- locked <0x00000004f111d290> (a java.security.SecureRandom)
at java.security.SecureRandom.next(SecureRandom.java:488)
at java.util.Random.nextInt(Random.java:303)
at com.sun.jndi.dns.DnsClient.query(DnsClient.java:175)
at com.sun.jndi.dns.Resolver.query(Resolver.java:81)
at com.sun.jndi.dns.DnsContext.c_getAttributes(DnsContext.java:430)
at com.sun.jndi.toolkit.ctx.ComponentDirContext.p_getAttributes(ComponentDirContext.java:231)
at com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.getAttributes(PartialCompositeDirContext.java:139)
at com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.getAttributes(PartialCompositeDirContext.java:127)
at javax.naming.directory.InitialDirContext.getAttributes(InitialDirContext.java:142)
经过分析,我发现这个线程锁是由于执行速度慢造成的 java.security.SecureRandom.next 。
下面是 jdk 针对遇到的类似死锁提交的错误
https://bugs.openjdk.java.net/browse/JDK-8066209
有人可以告诉我发生这种情况的原因以及如何解决这个问题吗?
我遇到了同样的问题,我相信我已经解决了。问题似乎是 SecureRandom.nextBytes
读取 /dev/random
。但是,如果 /dev/random
熵池中没有足够的熵,则读取将阻塞。有关可能的解决方案,请参阅 the Oracle docs about the issue, this excellent article about options for SecureRandom, and this bug 关于将 Java 选项设置为使用 /dev/./urandom
而不是看似等效的 /dev/urandom
以下是从 DNS 获取 TXT 记录时线程被锁定导致的死锁
java.lang.Thread.State: RUNNABLE
at java.io.FileInputStream.readBytes(Native Method)
at java.io.FileInputStream.read(FileInputStream.java:272)
at sun.security.provider.NativePRNG$RandomIO.readFully(NativePRNG.java:202)
at sun.security.provider.NativePRNG$RandomIO.ensureBufferValid(NativePRNG.java:264)
at sun.security.provider.NativePRNG$RandomIO.implNextBytes(NativePRNG.java:278)
- locked <0x00000004f3cd17b0> (a java.lang.Object)
at sun.security.provider.NativePRNG$RandomIO.access0(NativePRNG.java:125)
at sun.security.provider.NativePRNG.engineNextBytes(NativePRNG.java:114)
at java.security.SecureRandom.nextBytes(SecureRandom.java:466)
- locked <0x00000004f111d290> (a java.security.SecureRandom)
at java.security.SecureRandom.next(SecureRandom.java:488)
at java.util.Random.nextInt(Random.java:303)
at com.sun.jndi.dns.DnsClient.query(DnsClient.java:175)
at com.sun.jndi.dns.Resolver.query(Resolver.java:81)
at com.sun.jndi.dns.DnsContext.c_getAttributes(DnsContext.java:430)
at com.sun.jndi.toolkit.ctx.ComponentDirContext.p_getAttributes(ComponentDirContext.java:231)
at com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.getAttributes(PartialCompositeDirContext.java:139)
at com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.getAttributes(PartialCompositeDirContext.java:127)
at javax.naming.directory.InitialDirContext.getAttributes(InitialDirContext.java:142)
经过分析,我发现这个线程锁是由于执行速度慢造成的 java.security.SecureRandom.next 。
下面是 jdk 针对遇到的类似死锁提交的错误 https://bugs.openjdk.java.net/browse/JDK-8066209
有人可以告诉我发生这种情况的原因以及如何解决这个问题吗?
我遇到了同样的问题,我相信我已经解决了。问题似乎是 SecureRandom.nextBytes
读取 /dev/random
。但是,如果 /dev/random
熵池中没有足够的熵,则读取将阻塞。有关可能的解决方案,请参阅 the Oracle docs about the issue, this excellent article about options for SecureRandom, and this bug 关于将 Java 选项设置为使用 /dev/./urandom
而不是看似等效的 /dev/urandom