问题背景:
①程序莫名其妙: Caused by: java.net.SocketException: Connection reset
②Tomcat 启动慢
public class JRand {
public static void main(String args[]) throws Exception {
System.out.println("Ok: " +SecureRandom.getInstance("SHA1PRNG").nextLong());
}
}
执行测试:
time java JRand
time java -Djava.security.egd=file:/dev/urandom JRand
time java -Djava.security.egd=file:/dev/./urandom JRand
解决办法
1.在Tomcat环境中解决
可以通过配置JRE使用非阻塞的Entropy Source。
在catalina.sh中加入这么一行:-Djava.security.egd=file:/dev/./urandom 即可。
加入后再启动Tomcat,整个启动耗时下降到Server startup in 6213 ms,大大降低了启动的时间。
2.在JVM环境中解决
先执行which javac命令检查jdk安装路径
/usr/local/java/jdk1.8.0_92/bin/javac
去到$JAVA_PATH/jre/lib/security/java.security这个文件,找到下面的内容:
securerandom.source=file:/dev/urandom
替换成
securerandom.source=file:/dev/./urandom