3

我在 MacOSX Mavericks DP3 上运行带有 jdk7 的 tomcat7。一切顺利,启动仅需 500 毫秒。但突然,它减慢到 35 秒。

日志消息显示 SecureRandom 是根本原因。感谢谷歌,我发现这是一个 jre 错误,并使用以下代码进行验证:

import java.security.SecureRandom;
class JRand {
     public static void main(String args[]) throws Exception {
        System.out.println("Ok: " +
           SecureRandom.getInstance("SHA1PRNG").nextLong());
     }
}

是的。最简单的代码也需要 35 秒。但似乎所有这些相关的解决方案都不适合我。/dev/random 和 /dev/urandom 在 Mac 上都不是块设备。

cat /dev/random | hexdump -C

输出非常快!

当切换回 jre6 时,生成随机数非常快。下载最新的jdk8-ea,问题依旧。

事实上,不仅tomcat明显减速,Netbeans、glassfish都受到影响。在挣扎了几个小时后,我终于放弃了。

今天早上,当我来到办公室,插上以太网,你猜怎么着?它恢复了!

所以我的问题是,后面会发生什么?这真的很奇怪。

谢谢。

4

2 回答 2

1

哈哈,解决了。获取 InetAddress.java 源代码(可以从 IDE 复制);修改方法 getLocalHost 从

String local = impl.getLocalHostName();

至 :

String local = "localhost"; // impl.getLocalHostName();

重新编译它,并将 java.net.InetAddress.class 添加回 JDK/jre/lib/rt.jar。

解决。

于 2013-07-15T17:32:44.117 回答
0

不要更改 InetAddress,其他代码可能会依赖它。相反,将 sun.security.provider.SeedGenerator::getSystemEntropy() 更改为不使用本地 IP 地址。(无论如何,这有多安全?)作为额外的奖励,您现在通过默默无闻变得更加安全:)

于 2013-12-22T19:35:36.627 回答