https://blog.csdn.net/xujiamin0022016/article/details/88142973

tomcat8启动时SessionIdGeneratorBase.createSecureRandom耗时

14-Jul-2016 04:14:22.900 INFO [localhost-startStop-1] org.apache.catalina.util.SessionIdGenerator.createSecureRandom Creation of SecureRa
ndom instance for session ID generation using [SHA1PRNG] took [142,673] milliseconds.

在apache-tomcat官方文档:如何让tomcat启动更快 里面提到了一些启动时的优化项,其中一项是关于随机数生成时,采用的“熵源”(entropy source)的策略。

他提到tomcat7的session id的生成主要通过java.security.SecureRandom生成随机数来实现,随机数算法使用的是”SHA1PRNG”
private String secureRandomAlgorithm = "SHA1PRNG";
在sun/oracle的jdk里,这个算法的提供者在底层依赖到操作系统提供的随机数据,在linux上,与之相关的是/dev/random和/dev/urandom,对于这两个设备块的描述以前也见过讨论随机数的文章,wiki中有比较详细的描述,摘抄过来,先看/dev/random :
在读取时,/dev/random设备会返回小于熵池噪声总数的随机字节。/dev/random可生成高随机性的公钥或一次性密码本。若熵池空了,对/dev/random的读操作将会被阻塞,直到收集到了足够的环境噪声为止

而 /dev/urandom 则是一个非阻塞的发生器:
dev/random的一个副本是/dev/urandom (”unlocked”,非阻塞的随机数发生器),它会重复使用熵池中的数据以产生伪随机数据。这表示对/dev/urandom的读取操作不会产生阻塞,但其输出的熵可能小于/dev/random的。它可以作为生成较低强度密码的伪随机数生成器,不建议用于生成高强度长期密码。
另外wiki里也提到了为什么linux内核里的随机数生成器采用SHA1散列算法而非加密算法,是为了避开法律风险(密码出口限制)。

回到tomcat文档里的建议,采用非阻塞的熵源(entropy source),通过java系统属性来设置:
-Djava.security.egd=file:/dev/./urandom
catalina.sh中添加

if [[ "$JAVA_OPTS" != *-Djava.security.egd=* ]]; thenJAVA_OPTS="$JAVA_OPTS -Djava.security.egd=file:/dev/./urandom"
fi

这个系统属性egd表示熵收集守护进程(entropy gathering daemon),但这里值为何要在dev和random之间加一个点呢?是因为一个jdk的bug,在这个bug的连接里有人反馈及时对 securerandom.source 设置为 /dev/urandom 它也仍然使用的 /dev/random,有人提供了变通的解决方法,其中一个变通的做法是对securerandom.source设置为 /dev/./urandom 才行。也有人评论说这个不是bug,是有意为之。

我看了一下我当前所用的jdk7的java.security文件里,配置里仍使用的是/dev/urandom:

# Select the source of seed data for SecureRandom. By default an
# attempt is made to use the entropy gathering device specified by
# the securerandom.source property. If an exception occurs when
# accessing the URL then the traditional system/thread activity
# algorithm is used.
#
# On Solaris and Linux systems, if file:/dev/urandom is specified and it
# exists, a special SecureRandom implementation is activated by default.
# This “NativePRNG” reads random bytes directly from /dev/urandom.
#
# On Windows systems, the URLs file:/dev/random and file:/dev/urandom
# enables use of the Microsoft CryptoAPI seed functionality.
#
securerandom.source=file:/dev/urandom

我不确定jdk7里,这个 /dev/urandom 也同那个bug报告里所说的等同于 /dev/random;要使用非阻塞的熵池,这里还是要修改为/dev/./urandom 呢,还是jdk7已经修复了这个问题,就是同注释里的意思,只好验证一下。

使用bug报告里给出的代码:


import java.security.SecureRandom;
class JRand {public static void main(String args[]) throws Exception {System.out.println("Ok: " +SecureRandom.getInstance("SHA1PRNG").nextLong());}
}

java -Djava.security.egd=file:/dev/./urandom test.jar

自己测试tomcat8
catalina.sh

if [[ "$JAVA_OPTS" != *-Djava.security.egd=* ]]; thenJAVA_OPTS="$JAVA_OPTS -Djava.security.egd=file:/dev/./urandom"
fi

当然,如果不想修改catalina.sh脚本的话,建议自己写个启动程序,例如:


export JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom"
# 这个JAVA_OPTS   在catalina.sh脚本执行的时候,回获取(具体可看catalina.sh远吗)
sh /home/work/software/tomcat/bin/catalina.sh start > /dev/null 2>&1

[tomcat]-tomcat8启动时SessionIdGeneratorBase.createSecureRandom耗时相关推荐

  1. 启动两个tomcat,两个端口,两个tomcat都启动时回显示端口被占用

    启动两个tomcat,两个端口,两个tomcat都启动时回显示端口被占用,如图下 步骤: 使用两个tomcat,其中一个可以默认不修改 对另外一个tomcat,打开conf下的server.xml文件 ...

  2. Tomcat部署启动时发生错误报错:无法启动组件

    Tomcat部署启动时发生错误:无法启动组件 Tomcat启动后项目地址显示404:源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示. 或者 严重: ContainerBase.ad ...

  3. Tomcat软件启动时闪退

    问题, 1. 免安装的tomcat双击startup.bat后,启动窗口一闪而过,而且tomcat服务未启动. 2. 这里有时候修改了原本的web目录,也会闪退 原因是:在启动tomcat是,需要读取 ...

  4. 解决Tomcat8启动时控制台中文乱码

      启动Tomcat8的时候,可能会出现控制台中文乱码   实际上此时Tomcat已经启动成功了!但是可以看到控制台出现了乱码(也可能不会),这让人非常不爽.   原因很简单,Tomcat8默认使用U ...

  5. 如何不让tomcat在启动时弹窗_Tomcat在SpringBoot中是如何启动的

    来自:掘金 (作者:木木匠) 原文链接: https://juejin.im/post/5d3f95ebf265da039e12959e 前言 我们知道SpringBoot给我们带来了一个全新的开发体 ...

  6. 如何不让tomcat在启动时弹窗_Tomcat 在 Spring Boot 中是如何启动的

    优质文章,及时送达 作者 | 木木匠 链接 | my.oschina.net/luozhou/blog/3088908 前言 我们知道SpringBoot给我们带来了一个全新的开发体验,我们可以直接把 ...

  7. 关于Tomcat在启动时的socket bind failed 730048 错误

    一.错误产生原因 一般Tomcat启动不会出现这种错误,而这种错误的产生情况大多数为编辑器执行了重启操作,但在重启之前没有手动停止Tomcat服务. 二.具体分析 1.socket bind fail ...

  8. Linux下部署tomcat,启动时8005端口无法启动

    问题描述: 今天在公司的服务器上部署tomcat的项目,前端包.后端包甩到webapps文件夹下面去! ok!搞定!启动服务! tail -f logs/catalina.out 查看启动日志!ok! ...

  9. tomcat启动时SecureRandom耗时

    新部署tomcat发现启动时SecureRandom实例化耗时98秒,机器性能没问题.网上搜索了下是安全随机数生成的问题. 解决办法有两个: 方法1. 修改tomcat的bin下的catalina.s ...

最新文章

  1. 网络推广外包浅析怎样选择网站域名规则会更有利于SEO优化?
  2. Runtime's DiskExplorer手工填写分区表
  3. leetcode 58. Length of Last Word 题解【C++/Java/Python/JS】
  4. python 计算 IOU
  5. LINUX性能调优方法总结
  6. How is data replicted from HANA to AS
  7. 图论--最短路-- Dijkstra模板(目前见到的最好用的)
  8. ui设计基础_我不知道的UI设计的9个重要基础
  9. AntiSpy:一款功能强大的反病毒反Rootkit免费工具套件
  10. 黄章谈魅族5G手机计划:明年推出 后年终端才算成熟
  11. Python的第三方库pyppeteer
  12. 寻找发帖水王java_编程之美–寻找发帖水王 | Acm之家
  13. 二元二次方程例题_2元1次方程100道题 七年级数学下册二元二次方程组100道计算题及答案!......
  14. wamp mysql使用方法_wamp使用方法【总】
  15. C# 通过126邮箱发送邮件
  16. Bit Miracle Jpeg2000-SEO狼术
  17. 破解access密码
  18. 短视频行业内情分析-今抖云创
  19. Phoenix创建盐表
  20. 红旗linux试题,redflag认证部分试题

热门文章

  1. 怎么导出插件_不会插画没关系,插件帮你快速搞定
  2. HTML和CSS常见问题整理
  3. java可以转linux么_Java开发必会的Linux命令(转)
  4. java数组类型转换_java数据类型转换和数组总结
  5. c++ unicode转换中文_彻底弄懂UTF-8、Unicode、宽字符、locale
  6. nginx 配置SSL/HTTPS
  7. js 在新窗口中打开URL
  8. 服务器3个w目录文件夹,第 4 章 目录服务器条目 (Sun Java System Directory Server Enterprise Edition 6.2 管理指南)...
  9. c5.0 java_机器学习-AdaBoosting及其Java实现
  10. 2018一级计算机基础,2018年计算机一级考试计算机基础及Photoshop试题及答案.pdf