2013-07-15 62 views
3

我在MacOSX Mavericks DP3上運行帶有jdk7的tomcat7。 一切順利,啓動只需要500毫秒。 但突然,它減慢到35秒。java7在MacOSX上的SecureRandom性能

日誌消息顯示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秒。 但似乎所有這些相關解決方案都不適合我。 在Mac上,/ dev/random和/ dev/urandom都不是塊設備。

cat /dev/random | hexdump -C 

輸出非常快!

當切換回jre6時,生成隨機數的速度非常快。 下載最新的jdk8-ea,問題依然存在。

事實上,不僅tomcat顯着下降,Netbeans,glassfish都受到影響。 經過幾個小時的掙扎後,我終於放棄了。

今天早上我上班的時候插上了以太網,猜怎麼着? 它恢復了!

所以我的問題是,後面發生了什麼?這真的很奇怪。

謝謝。

+0

現在它又來了。 輪廓工具顯示它的調用時阻止: java.net.Inet6AddressImpl.lookupAllHostAddr(主機名)從java.net.InetAddress.getLocalHost () :'( – outersky

+0

它是一個本地方法。 – outersky

回答

1

哈哈,已解決。獲取InetAddress.java源代碼(可以從IDE複製); 修改方法從的getLocalHost

String local = impl.getLocalHostName(); 

到:

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

重新編譯它,並添加java.net.InetAddress.class回JDK/JRE/LIB/rt.jar中。

已解決。

0

不要更改InetAddress,其他代碼可能依賴它。相反,更改sun.security.provider.SeedGenerator :: getSystemEntropy()不使用本地IP地址。 (無論如何,這有多安全?)作爲額外的好處,你現在變得更安全,通過默默無聞:)