jdk的配置文件中,使用securerandom.source
設置了熵源:java
cat /usr/java/jdk1.8.0_121/jre/lib/security/java.security securerandom.source=file:/dev/random
能夠看到默認值是:/dev/random
。
因此程序啓動後SecureRandom
類會讀取/dev/random
以獲取隨機序列,這是一個同步操做。當熵池(entropy pool)
中沒有足夠的熵時,讀取/dev/random
就會形成阻塞,直到收集到了足夠的熵,程序纔會繼續往下進行。
(關於什麼是/dev/random
,能夠查看 wiki的介紹)app
解決方法是修改爲非阻塞的熵源/dev/urandom
。
能夠修改java.security
文件中的securerandom.source
值,也能夠使用參數java.security.egd
:dom
java -jar app.jar -Djava.security.egd=file:/dev/./urandom
至於爲何是/dev/./urandom
,而不是/dev/urandom
,這源於java的一個bug。大意是/dev/urandom
在某些狀況下可能仍是最終會轉換成調用/dev/random
。因此爲了保險起見,仍是使用/dev/./urandom
吧!code