Tomcat启动一直卡在webapps/ROOT的解决方案

Tomcat启动一直卡在webapps/ROOT的解决方案

问题现象

  • 启动tomcat并查看日志发现启动到webapps/ROOT时卡住
Apr 09, 2021 4:27:12 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["ajp-bio-8009"]
Apr 09, 2021 4:27:12 PM org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 766 ms
Apr 09, 2021 4:27:12 PM org.apache.catalina.core.StandardService startInternal
INFO: Starting service Catalina
Apr 09, 2021 4:27:12 PM org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet Engine: Apache Tomcat/7.0.91
Apr 09, 2021 4:27:12 PM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory /root/transform/tomcat-transform/webapps/ROOT

解决方案:在 JVM 环境中解决

打开 $JAVA_PATH/jre/lib/security/java.security 这个文件,找到下面的内容

securerandom.source=file:/dev/random

替换成

securerandom.source=file:/dev/./urandom

说一下这个random和urandom的区别:

tomcat启动的时候会实例化SecureRandom对象,实例化对象使用org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom类产生安全随机类SecureRandom的实例作为会话ID产生。Tomcat使用SHA1PRNG算法是基于SHA-1算法实现且保密性较强的伪随机数生成器。在SHA1PRNG中,有一个种子产生器,它根据配置执行各种操作。

Linux 中的随机数可以从两个特殊的文件中产生,一个是 /dev/urandom,另外一个是 /dev/random。他们产生随机数的原理是利用当前系统的熵池来计算出固定一定数量的随机比特,然后将这些比特作为字节流返回。熵池就是当前系统的环境噪音,熵指的是一个系统的混乱程度,系统噪音可以通过很多参数来评估,如内存的使用,文件的使用量,不同类型的进程数量等等。如果当前环境噪音变化的不是很剧烈或者当前环境噪音很小,比如刚开机的时候,而当前需要大量的随机比特,这时产生的随机数的随机效果就不是很好了。

这就是为什么会有 /dev/urandom 和 /dev/random 这两种不同的文件,后者在不能产生新的随机数时会阻塞程序,而前者不会(ublock),当然产生的随机数效果就不太好了,这对加密解密这样的应用来说就不是一种很好的选择。/dev/random 会阻塞当前的程序,直到根据熵池产生新的随机字节之后才返回,所以使用 /dev/random 比使用 /dev/urandom 产生大量随机数的速度要慢。

SecureRandom generateSeed 使用 /dev/random 生成种子。但是 /dev/random 是一个阻塞数字生成器,如果它没有足够的随机数据提供,它就一直等,这迫使 JVM 等待。键盘和鼠标输入以及磁盘活动可以产生所需的随机性或熵。但在一个服务器缺乏这样的活动,可能会出现问题。

目前tomcat7和tomcat8都是使用的这种方式来实例化SecureRandom对象的。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/101865.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 设置Textview最大长度,超出显示省略号

    其中很关键推荐:http://www.cnblogs.com/roucheng/p/androidwujie.html

    2021年12月27日
    43
  • asm 盘头损失,破坏

    asm 盘头损失,破坏

    2022年1月4日
    40
  • 连接查询和子查询哪个效率高

    连接查询和子查询哪个效率高需要进行多表查询的情况下,用连接查询和子查询哪个效率高?1、什么是子查询?举个简单的例子,那么子查询有什么优劣呢?子查询(内查询)在主查询之前一次执行完成。子查询的结果被主查询(外查询)使用。可以用一个子查询替代上边的的表名。子查询,将查询操作嵌套在另一个查询操作中。先执行子查询,再执行外查询注:在查询时基于未知的值时,应使用子查询子查询可以返回多个结果/单个结果,结果个数不同应该使用不同的操作符通过子查询不难看出,可以根据employee_id查到department_

    2022年5月29日
    232
  • mysql事务回滚机制概述「建议收藏」

    mysql事务回滚机制概述

    2022年2月17日
    29
  • 传感器超声波雷达「建议收藏」

    传感器超声波雷达「建议收藏」转自:http://www.itsiwei.com/21962.html在上一次分享中,我介绍了毫米波雷达的原理、数据特性及优缺点。毫米波雷达的低环境敏感和低成本的特性使得其在ADAS和自动驾驶领域得到了广泛的应用。今天要介绍的是一款极其常见的传感器——超声波雷达。如果你觉得超声波雷达有些陌生,那么它还有一个更通俗的名字——倒车雷达。在倒车入库,慢慢挪动车子的过程中,在驾驶室内能听到”…

    2022年9月12日
    0
  • 初识JMM_一!,识J

    初识JMM_一!,识J1.什么是JMM?JMM:(JavaMemoryModel的缩写)作用:缓存一致性协议,用于定义数据读写的规则。JMM定义了线程工作内存和主内存之间的抽象关系:线程之间的共享变量存储在主内存(MainMemory)中,每个线程都有一个私有的本地内存(LocalMemory)所有的变量都存储在主内存中,每个线程还有自己的工作内存,工作内存存储在高速缓存或者寄存器中,保存了该线程使用的变量的主内存副本拷贝。线程只能直接操作工作内存中的变量,不同线程之间的变量值传递需要通过主内存来完成。

    2022年9月5日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号