springboot项目启动慢,怀疑jdk有问题
项目启动慢,并且没有启动日志,开发环境和windows服务器都正常,到linux后出现问题,你觉得会是哪儿的问题?
最近收到一位同事求助,说springboot应用在客户的一台Linux机器上启动非常慢,超过10分钟,并且没有任何日志。而之前部署在window服务器上面没有问题;

正是因为这个求助,我开始重新审查之前遗留的一个spring微服务启动慢的问题。于是我开始分析之前遗留的项目问题,如果解决了,没准能一箭双雕,把这次同事的问题也解决了。经过我缜密的分析,顺利将历史遗留的spring cloud启动慢的问题给解决了,并且写了一个总结分享给了同事,案例分享在这里。在解决了spring cloud服务启动慢的问题后,我怀疑这个项目的linux服务器也是相同的原因。于是我让他先配置host,把ipv6的解析也配置上。但是,同事说配置host后启动还是很慢。这就奇了怪了。
jstack利器
对于这种日志都没有打印出来的程序,只能使用jstack先尝试看看,能否取到当前运行堆栈了。于是我让同事给打印了一个,结果如下:

当我看到最上面一行,我首先怀疑是系统在启动的时候,读取到没有权限的文件或者不存在的文件了。

并指出是入口方法第16行,结果同事给我截图源码,16行只是springboot的程序的启动方法。而同事也有自己的看法,他觉得这台linux机器的jdk安装有问题。中间争论不休(此处省略3000字),一度陷入歧途。
后来我又认真看了看代码和堆栈,发现是springboot在启动的时候,需要用到一个uuid,而uuid依赖随机数,系统在生成随机数的时候阻塞了。

发现问题,百度一下,发现可以通过增加jvm参数-Djava.security.egd=file:/dev/urandom来解决。
于是让同事增加测试,增加之后,启动速度快了很多(意思是比原来快了,但是仍然比在本机启动慢)。好家伙,百度方案不好使啊。于是我又深入的研究了一下。发现是linux熵池耗尽导致随机数生成慢。估计是这台linux老久没人使用了。解决方法就是使用软件,增加熵池的值。我安装的ng-tools,安装方法可以百度。
安装之后,程序启动比在本机和linux启动还快。
你可能会有疑问,这个问题其实可以一开始就看出来。但是换做是你,也未必一眼就看出问题。这个问题发生的时候,同事还在问我另外一个海康威视sdk导致程序崩溃的问题。现实就是这样,你必须在吵闹的环境中保持冷静,才能找到问题的原因。
也许你对以下话题也感兴趣
生产环境部署springcloud微服务启动慢的问题排查
springboot项目启动慢,怀疑jdk有问题的更多相关文章
- Springboot 项目启动后执行某些自定义代码
Springboot 项目启动后执行某些自定义代码 Springboot给我们提供了两种"开机启动"某些方法的方式:ApplicationRunner和CommandLineRun ...
- springBoot项目启动类启动无法访问
springBoot项目启动类启动无法访问. 网上也查了一些资料,我这里总结.下不来虚的,也不废话. 解决办法: 1.若是maven项目,则找到右边Maven Projects --->Plug ...
- SpringBoot项目启动时链接数据库很慢
SpringBoot项目启动时链接数据库很慢 springboot项目在启动时候,如下图所示,链接数据库很慢 解决方法:在mysql 的配置文件中 配置 skip-name-resolve
- springboot项目启动成功后执行一段代码的两种方式
springboot项目启动成功后执行一段代码的两种方式 实现ApplicationRunner接口 package com.lnjecit.lifecycle; import org.springf ...
- springboot项目启动之后初始化自定义配置类
前言 今天在写项目的时候,需要再springboot项目启动之后,加载我自定义的配置类的一些方法,百度了之后特此记录下. 正文 方法有两种: 1. 创建自定义类实现 CommandLineRunner ...
- 【log4j】springboot项目启动 ,使用的druid数据源,log4j报错 log4j:WARN Please initialize the log4j system properly.
springboot项目启动 ,使用的druid数据源,log4j报错 -- :: --- [ restartedMain] o.hibernate.annotations.common.Versio ...
- Springboot项目启动不了。也不打印任何日志信息。
Springboot项目启动不了.也不打印任何日志信息. <!-- 在创建Spring Boot工程时,我们引入了spring-boot-starter,其中包含了spring-boot-sta ...
- springboot项目启动报错Failed to configure a DataSource: 'url' attribute is not specified and no embedde
springboot项目启动报错Failed to configure a DataSource: 'url' attribute is not specified and no embedde 创建 ...
- springboot项目启动无法访问到controller原因之一:引导类位置有问题
新建的springboot项目启动后,无法访问到controller 页面是404错误 查看项目结构,发现是新建工程的启动类位置有问题,controller类应该位于引导类的同级包或者子级包中.需要将 ...
- springboot 项目启动脚本
springboot项目启动可通过下面的shell脚本启动. startup.sh app=order-service-rest.jar appout=logs/${app/.jar/.out} ap ...
随机推荐
- Flink 实践教程:入门(6):读取 PG 数据写入 ClickHouse
作者:腾讯云流计算 Oceanus 团队 流计算 Oceanus 简介 流计算 Oceanus 是大数据产品生态体系的实时化分析利器,是基于 Apache Flink 构建的具备一站开发.无缝连接.亚 ...
- Hi3516开发笔记(一):海思HI3516DV300芯片介绍,入手开发板以及Demo测试
前言 目前主流国产芯片为RV11XX.RK33XX.Hi35XX系列,本系列开启Hi3516系列的开发教程. Hi3516DV300芯片介绍 Hi3516DV300为专业行Smart IP ...
- git修改用户和邮箱
GIT查看当前用户以及邮箱 $ git config user.name $ git config user.email GIT修改用户以及邮箱 $ git config --global user. ...
- [loj6278]数列分块入门2
做法1 以$K$为块大小分块,并对每一个块再维护一个排序后的结果,预处理复杂度为$o(n\log K )$ 区间修改时将整块打上标记,散块暴力修改并归并排序,单次复杂度为$o(\frac{n}{K}+ ...
- [luogu4607]反回文串
参考ARC064F 令$h(n)=\begin{cases}n(n为奇数)\\\frac{n}{2}(n为偶数)\end{cases}$,$f(n)$定义与ARC064F相同,答案即$\sum_{d| ...
- [loj3049]字符串问题
考虑将所有A串向所能支配的B串连边,B串向满足B串是A串前缀的A串连边,在A串上有点权,跑最长路即可但这样前缀的边太多,考虑优化:在后缀树上,将这些串插入进去(注意相同的串A串要在B串下面),并将父亲 ...
- CODING 项目协同 2.0 —— 让协作有条不紊
本文为 CODING 高级产品经理王海明 在腾讯云 CIF 工程效能峰会上所做的分享.文末可前往峰会官网,观看回放并下载 PPT. 大家好,我是 CODING 高级产品经理王海明,今天与大家分享的是项 ...
- 理解ASP.NET Core - 过滤器(Filters)
注:本文隶属于<理解ASP.NET Core>系列文章,请查看置顶博客或点击此处查看全文目录 Filter概览 如果你是从ASP.NET一路走过来的,那么你一定对过滤器(Filter)不陌 ...
- C/C++ Qt Tree与Tab组件实现分页菜单
虽然TreeWidget组件可以实现多节点的增删改查,但多节点操作显然很麻烦,在一般的应用场景中基本上只使用一层结构即可解决大部分开发问题,TreeWidget组件通常可配合TabWidget组件,实 ...
- CF1578J Just Kingdom
考虑一个点被填满则他需要从其父亲得到\(q_u = \sum_{v = u\ or\ v \in son_u}m_v\) 那么考虑如何这样操作. 我当时world final做的时候,是从上往下遍历, ...