我真的认为在各种平台上安装大约200个或更多tomcat之后,我已经准备好迎接任何挑战,但这个很棘手.
我创建了一个vanilla Ubunutu 14_04图像,并在该系统上从oracle安装了Java 8 TGZ.此外,我在游戏中添加了一个tomcat 8.然后我启动了vanilla服务器安装.
在暂停部署tomcat附带的默认应用程序后不久,我想知道那里发生了什么,并做了一些线程.这个是阻止tomcat启动的糟糕线程:
"localhost-startStop-1" #15 daemon prio=5 os_prio=0 tid=0x00007f37c8004800 nid=0x4d6 runnable [0x00007f37b38b3000]
java.lang.Thread.State: RUNNABLE
at java.io.FileInputStream.readBytes(Native Method)
at java.io.FileInputStream.read(FileInputStream.java:246)
at sun.security.provider.SeedGenerator$URLSeedGenerator.getSeedBytes(SeedGenerator.java:539)
at sun.security.provider.SeedGenerator.generateSeed(SeedGenerator.java:144)
at sun.security.provider.SecureRandom$SeederHolder.<clinit>(SecureRandom.java:192)
at sun.security.provider.SecureRandom.engineNextBytes(SecureRandom.java:210)
- locked <0x00000000f06e6ce8> (a sun.security.provider.SecureRandom)
at java.security.SecureRandom.nextBytes(SecureRandom.java:457)
- locked <0x00000000f06e71c0> (a java.security.SecureRandom)
at java.security.SecureRandom.next(SecureRandom.java:480)
at java.util.Random.nextInt(Random.java:329)
at org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom(SessionIdGeneratorBase.java:234)
Run Code Online (Sandbox Code Playgroud)
经过更多谷歌和朋友,我发现SeedGeneratorJDK附带的是我的问题的根源.有趣的是,有时SeedGenerator会在几分钟后回来,有时它只是悬挂(熵耗尽?......通过检查cat /proc/sys/kernel/random/entropy_avail).经过更多研究后,我发现$JAVA_HOME$/lib/security/java.security调用中的配置变量securerandom.source定义了Random的源代码.在我的情况下,或者更好的oracle JDK 8安装Linux,它是/dev/random.我不是Linux专家(我是一名java开发人员),但我所理解的是,这/dev/random可能会耗尽熵(无论这意味着什么),但也许这意味着在某些时候它无法生成更多随机数).我切换到了/dev/urandom,我的tomcat一切都很好.
然后我检查了其他JDK安装在我的其他各种服务器上的外观,这些服务器是OpenJDK和旧的Oracle JDK安装的混合体.至少OpenJDK总是使用/dev/urandom可能的答案,为什么我之前从未遇到过这个问题.
现在我的问题是:从Oracle开始依赖于/dev/random何时可能存在操作系统无法生成更多数字的极端情况?我的意思是像Tomcat这样的服务器和许多其他服务器依赖于SeedGeneratorJDK并且调试这种错误是非常先进的.花了我2个小时才到达我现在的位置.