tomcat8启动太慢解决以及内存优化方法
情况描述
jdk是1.8版本的,tomcat是8.5.9版本的
正常安装完之后不加任何自己的项目包,启动有时候耗时2分钟左右。
查看tomcat日志,在下面这步启动时间耗时比较长
在这一步耗时较长 createSecureRandom Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took
/temp 04-Jun-2017 17:06:12.987 信息 [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: /usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib 04-Jun-2017 17:06:13.073 信息 [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["http-nio-8066"] 04-Jun-2017 17:06:13.084 信息 [main] org.apache.tomcat.util.net.NioSelectorPool.getSharedSelector Using a shared selector for servlet write/read 04-Jun-2017 17:06:13.086 信息 [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["ajp-nio-8009"] 04-Jun-2017 17:06:13.087 信息 [main] org.apache.tomcat.util.net.NioSelectorPool.getSharedSelector Using a shared selector for servlet write/read 04-Jun-2017 17:06:13.087 信息 [main] org.apache.catalina.startup.Catalina.load Initialization processed in 354 ms 04-Jun-2017 17:06:13.103 信息 [main] org.apache.catalina.core.StandardService.startInternal Starting service Catalina 04-Jun-2017 17:06:13.103 信息 [main] org.apache.catalina.core.StandardEngine.startInternal Starting Servlet Engine: Apache Tomcat/8.5.9 04-Jun-2017 17:06:13.109 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory /dawn/tomcat/webapps/ROOT 04-Jun-2017 17:08:11.808 信息 [localhost-startStop-1] org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [118,522] milliseconds. 04-Jun-2017 17:08:11.845 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory /dawn/tomcat/webapps/ROOT has finished in 118,735 ms 04-Jun-2017 17:08:11.845 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory /dawn/tomcat/webapps/docs 04-Jun-2017 17:08:11.863 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory /dawn/tomcat/webapps/docs has finished in 18 ms 04-Jun-2017 17:08:11.863 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory /dawn/tomcat/webapps/examples 04-Jun-2017 17:08:12.019 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory /dawn/tomcat/webapps/examples has finished in 156 ms 04-Jun-2017 17:08:12.019 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory /dawn/tomcat/webapps/host-manager
百度一下查看相关原因
http://www.weare.net.cn/article/7a87bf0c3d88f7cabd96b81aeb824f48.html
Tomcat7/8都使用org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom类产生安全随机类SecureRandom的实例作为会话ID,这里花去了342秒,也即接近6分钟。
SHA1PRNG算法是基于SHA-1算法实现且保密性较强的伪随机数生成器。在SHA1PRNG中,有一个种子产生器,它根据配置执行各种操作。
1)如果Java.security.egd 属性或securerandom.source属性指定的是”file:/dev/random”或”file:/dev/urandom”,
那么JVM 会使用本地种子产生器NativeSeedGenerator,它会调用super()方法,即调用 SeedGenerator.URLSeedGenerator(/dev/random)方法进行初始化。
2)如果java.security.egd属性或securerandom.source属性指定的是其它已存在的URL,那么会调用SeedGenerator.URLSeedGenerator(url)方法进行初始化。
这就是为什么我们设置值为”file:///dev/urandom”或者值为”file:/./dev/random”都会起作用的原因。
在这个实现中,产生器会评估熵池(entropy pool)中的噪声数量。随机数是从熵池中进行创建的。
当读操作时,/dev/random设备会只返回熵池中噪声的随机字节。/dev/random非常适合那些需要非常高质量随机性的场景,比如一次性的支付或生成密钥的场景。
当熵池为空时,来自/dev/random的读操作将被阻塞,直到熵池收集到足够的环境噪声数据。
这么做的目的是成为一个密码安全的伪随机数发生器,熵池要有尽可能大的输出。对于生成高质量的加密密钥或者是需要长期保护的场景,一定要这么做。
那么什么是环境噪声?
随机数产生器会手机来自设备驱动器和其它源的环境噪声数据,并放入熵池中。产生器会评估熵池中的噪声数据的数量。当熵池为空时,这个噪声数据的收集是比较花时间的。这就意味着,Tomcat在生产环境中使用熵池时,会被阻塞较长的时间。
解决
有两种解决办法:
1)在Tomcat环境中解决
可以通过配置JRE使用非阻塞的Entropy Source。
在catalina.sh中加入这么一行:-Djava.security.egd=file:/dev/./urandom 即可。
加入后再启动Tomcat,整个启动耗时下降到Server startup in 2912 ms。
2)在JVM环境中解决
打开$JAVA_PATH/jre/lib/security/java.security这个文件,找到下面的内容:
securerandom.source=file:/dev/urandom
替换成
securerandom.source=file:/dev/./urandom
本次使用第一种方式解决:

加上tomcat优化参数。我的参数如下,第二行就是
# OS specific support. $var _must_ be set to either true or false. JAVA_OPTS='-server -Djava.security.egd=file:/dev/./urandom -Xms1024m -Xmx1024m -XX:MetaspaceSize=64m -XX:MaxNewSize=256m -XX:MaxMetaspaceSize=128m' cygwin=false darwin=false
更改之后启动都是秒级启动
浙公网安备 33010602011771号