docker+tomcat 啟動時非常慢降淮,一般正常啟動幾十秒的,發(fā)現(xiàn)docker+tomcat啟動竟需要幾分鐘角溃,不可思議
根本原因是?SecureRandom 這個 jre 的工具類的問題。那為什么 SecureRandom generateSeed 這么慢,甚至掛在 Linux 操作系統(tǒng)呢蚂且?
Tomcat 7/8 都使用 org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom 類產(chǎn)生安全隨機類 SecureRandom 的實例作為會話 ID。
SecureRandom generateSeed? 使用 /dev/random 生成種子幅恋。但是 /dev/random 是一個阻塞數(shù)字生成器杏死,如果它沒有足夠的隨機數(shù)據(jù)提供,它就一直等捆交,這迫使 JVM 等待淑翼。鍵盤和鼠標輸入以及磁盤活動可以產(chǎn)生所需的隨機性或熵。但在一個服務器缺乏這樣的活動品追,可能會出現(xiàn)問題玄括。
有2種解決方案:
1. 在Tomcat環(huán)境中解決:
可以通過配置 JRE 使用非阻塞的 Entropy Source:
在 catalina.sh 中加入這么一行:-Djava.security.egd=file:/dev/./urandom即可。
2. 在 JVM 環(huán)境中解決(本人使用此方法):
打開jdk安裝路徑 $JAVA_PATH/jre/lib/security/java.security 這個文件肉瓦,找到下面的內(nèi)容:
securerandom.source=file:/dev/random
替換成:
securerandom.source=file:/dev/./urandom
問題完美解決
這里值為何要在 dev 和 random 之間加一個點呢遭京?是因為一個 JDK 的 bug,有人反饋即使對 securerandom.source 設置為 /dev/urandom 它也仍然使用的 /dev/random泞莉,有人提供了變通的解決方法哪雕,其中一個變通的做法是對 securerandom.source 設置為 /dev/./urandom 才行。也有人評論說這個不是 bug戒财,是有意為之热监。