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 ...
随机推荐
- Markdown For EditPlus插件使用说明(基于EditPlus快速编辑Markdonw文件,写作爱好者的福音来啦)
Markdown For EditPlus插件使用说明 开发缘由 特点好处: 中文版使用说明 相关命令(输入字符敲空格自动输出): EditPlus常用快捷键: 相关教程: English descr ...
- React-Router学习(基础路由与嵌套路由)
示例:基本路由 在这个例子中,我们有3个'Page'组件处理<Router>. 注意:而不是<a href="/">我们使用<Link to=&quo ...
- 菜鸡的Java笔记 国际化程序实现原理
国际化程序实现原理 Lnternationalization 1. Locale 类的使用 2.国家化程序的实现,资源读取 所谓的国际化的程序 ...
- [atAGC052F]Tree Vertices XOR
结论 注意到如果$x$周围有偶数个1,对$x$操作显然不会改变$a_{x}$,因此不妨强制操作的点周围要有奇数个1,不难发现此时恰好会改变该点,即令$a_{x}=a_{x}\oplus 1$ 称$\{ ...
- [loj3146]路灯
显然,能从$l$到$r$当且仅当$[l,r)$中的灯全部都亮,以下不妨令询问的$r$全部减1 当修改节点$x$时,找到包含$x$的极大的灯(除$x$以外)全部都亮的区间$[l,r]$,即令$l_{0} ...
- [hdu6601]Keen On Everything But Triangle
有两个结论:1.排序后,答案一定是连续的三个数:2.当序列长度超过44一定有三个相同的数(因为即使该序列是斐波那契数列,此时也超过了1e9),然后用主席树等数据结构(略卡常,建议主席树)来维护前45大 ...
- [bzoj1232]安慰奶牛
先考虑边的代价,容易发现每一条边都需要走两次,也就是2*边权再考虑点的代价,由于上面的结论,那么就是度数*点权然后就可以构造新的边权为2*原边权+连接点的点权,然后求最小生成树即可注意根还有一个点权, ...
- settings.json文件语法错误先清理错误再重试
运行官方demo,提示要微信开发者工具,导入路径出这玩意. 点击工具,设置,源码试图,把左边代码全部复制到右边, "weApp.devTools.path":"W:\\微 ...
- layui增加转圈效果
var loadix = layer.load(1, {shade: [0.1,'#fff']}); layer.close(loadix);
- KNN算法实现对iris数据集的预测
KNN算法的实现 import pandas as pd from math import dist k = int(input("请输入k值:")) dataTest = pd. ...