使用Tomcat 8.5 發(fā)現(xiàn)啟動(dòng)很慢坟乾,有時(shí)候都能超過(guò)一分鐘跨琳,經(jīng)過(guò)查詢,發(fā)現(xiàn)如下解決方案:
編輯 /application/jdk/jre/lib/security/java.security 文件
將其中的
securerandom.source=file:/dev/random
更改為
securerandom.source=file:/dev/./urandom
其中的原因如下(摘抄自網(wǎng)絡(luò)):
根本原因是 SecureRandom 這個(gè) jre 的工具類的問題岳枷。那為什么 SecureRandom generateSeed 這么慢声滥,甚至掛在 Linux 操作系統(tǒng)呢?
Tomcat 7/8 都使用 org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom 類產(chǎn)生安全隨機(jī)類 SecureRandom 的實(shí)例作為會(huì)話 ID剧蹂。
Tomcat 使用 SHA1PRNG 算法是基于 SHA-1 算法實(shí)現(xiàn)且保密性較強(qiáng)的偽隨機(jī)數(shù)生成器声功。
在 SHA1PRNG 中,有一個(gè)種子產(chǎn)生器宠叼,它根據(jù)配置執(zhí)行各種操作先巴。
Linux 中的隨機(jī)數(shù)可以從兩個(gè)特殊的文件中產(chǎn)生,一個(gè)是 /dev/urandom冒冬,另外一個(gè)是 /dev/random伸蚯。他們產(chǎn)生隨機(jī)數(shù)的原理是利用當(dāng)前系統(tǒng)的熵池來(lái)計(jì)算出固定一定數(shù)量的隨機(jī)比特,然后將這些比特作為字節(jié)流返回简烤。熵池就是當(dāng)前系統(tǒng)的環(huán)境噪音剂邮,熵指的是一個(gè)系統(tǒng)的混亂程度,系統(tǒng)噪音可以通過(guò)很多參數(shù)來(lái)評(píng)估横侦,如內(nèi)存的使用挥萌,文件的使用量,不同類型的進(jìn)程數(shù)量等等枉侧。如果當(dāng)前環(huán)境噪音變化的不是很劇烈或者當(dāng)前環(huán)境噪音很小引瀑,比如剛開機(jī)的時(shí)候,而當(dāng)前需要大量的隨機(jī)比特榨馁,這時(shí)產(chǎn)生的隨機(jī)數(shù)的隨機(jī)效果就不是很好了憨栽。
這就是為什么會(huì)有 /dev/urandom 和 /dev/random 這兩種不同的文件,后者在不能產(chǎn)生新的隨機(jī)數(shù)時(shí)會(huì)阻塞程序翼虫,而前者不會(huì)(ublock)屑柔,當(dāng)然產(chǎn)生的隨機(jī)數(shù)效果就不太好了,這對(duì)加密解密這樣的應(yīng)用來(lái)說(shuō)就不是一種很好的選擇珍剑。/dev/random 會(huì)阻塞當(dāng)前的程序掸宛,直到根據(jù)熵池產(chǎn)生新的隨機(jī)字節(jié)之后才返回,所以使用 /dev/random 比使用 /dev/urandom 產(chǎn)生大量隨機(jī)數(shù)的速度要慢招拙。
SecureRandom generateSeed 使用 /dev/random 生成種子旁涤。但是 /dev/random 是一個(gè)阻塞數(shù)字生成器翔曲,如果它沒有足夠的隨機(jī)數(shù)據(jù)提供,它就一直等劈愚,這迫使 JVM 等待。鍵盤和鼠標(biāo)輸入以及磁盤活動(dòng)可以產(chǎn)生所需的隨機(jī)性或熵闻妓。但在一個(gè)服務(wù)器缺乏這樣的活動(dòng)菌羽,可能會(huì)出現(xiàn)問題。