项目启动慢,并且没有启动日志,开发环境和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有问题的更多相关文章

  1. Springboot 项目启动后执行某些自定义代码

    Springboot 项目启动后执行某些自定义代码 Springboot给我们提供了两种"开机启动"某些方法的方式:ApplicationRunner和CommandLineRun ...

  2. springBoot项目启动类启动无法访问

    springBoot项目启动类启动无法访问. 网上也查了一些资料,我这里总结.下不来虚的,也不废话. 解决办法: 1.若是maven项目,则找到右边Maven Projects --->Plug ...

  3. SpringBoot项目启动时链接数据库很慢

    SpringBoot项目启动时链接数据库很慢 springboot项目在启动时候,如下图所示,链接数据库很慢 解决方法:在mysql 的配置文件中 配置 skip-name-resolve

  4. springboot项目启动成功后执行一段代码的两种方式

    springboot项目启动成功后执行一段代码的两种方式 实现ApplicationRunner接口 package com.lnjecit.lifecycle; import org.springf ...

  5. springboot项目启动之后初始化自定义配置类

    前言 今天在写项目的时候,需要再springboot项目启动之后,加载我自定义的配置类的一些方法,百度了之后特此记录下. 正文 方法有两种: 1. 创建自定义类实现 CommandLineRunner ...

  6. 【log4j】springboot项目启动 ,使用的druid数据源,log4j报错 log4j:WARN Please initialize the log4j system properly.

    springboot项目启动 ,使用的druid数据源,log4j报错 -- :: --- [ restartedMain] o.hibernate.annotations.common.Versio ...

  7. Springboot项目启动不了。也不打印任何日志信息。

    Springboot项目启动不了.也不打印任何日志信息. <!-- 在创建Spring Boot工程时,我们引入了spring-boot-starter,其中包含了spring-boot-sta ...

  8. 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 创建 ...

  9. springboot项目启动无法访问到controller原因之一:引导类位置有问题

    新建的springboot项目启动后,无法访问到controller 页面是404错误 查看项目结构,发现是新建工程的启动类位置有问题,controller类应该位于引导类的同级包或者子级包中.需要将 ...

  10. springboot 项目启动脚本

    springboot项目启动可通过下面的shell脚本启动. startup.sh app=order-service-rest.jar appout=logs/${app/.jar/.out} ap ...

随机推荐

  1. Markdown For EditPlus插件使用说明(基于EditPlus快速编辑Markdonw文件,写作爱好者的福音来啦)

    Markdown For EditPlus插件使用说明 开发缘由 特点好处: 中文版使用说明 相关命令(输入字符敲空格自动输出): EditPlus常用快捷键: 相关教程: English descr ...

  2. React-Router学习(基础路由与嵌套路由)

    示例:基本路由 在这个例子中,我们有3个'Page'组件处理<Router>. 注意:而不是<a href="/">我们使用<Link to=&quo ...

  3. 菜鸡的Java笔记 国际化程序实现原理

    国际化程序实现原理 Lnternationalization        1. Locale 类的使用        2.国家化程序的实现,资源读取                所谓的国际化的程序 ...

  4. [atAGC052F]Tree Vertices XOR

    结论 注意到如果$x$周围有偶数个1,对$x$操作显然不会改变$a_{x}$,因此不妨强制操作的点周围要有奇数个1,不难发现此时恰好会改变该点,即令$a_{x}=a_{x}\oplus 1$ 称$\{ ...

  5. [loj3146]路灯

    显然,能从$l$到$r$当且仅当$[l,r)$中的灯全部都亮,以下不妨令询问的$r$全部减1 当修改节点$x$时,找到包含$x$的极大的灯(除$x$以外)全部都亮的区间$[l,r]$,即令$l_{0} ...

  6. [hdu6601]Keen On Everything But Triangle

    有两个结论:1.排序后,答案一定是连续的三个数:2.当序列长度超过44一定有三个相同的数(因为即使该序列是斐波那契数列,此时也超过了1e9),然后用主席树等数据结构(略卡常,建议主席树)来维护前45大 ...

  7. [bzoj1232]安慰奶牛

    先考虑边的代价,容易发现每一条边都需要走两次,也就是2*边权再考虑点的代价,由于上面的结论,那么就是度数*点权然后就可以构造新的边权为2*原边权+连接点的点权,然后求最小生成树即可注意根还有一个点权, ...

  8. settings.json文件语法错误先清理错误再重试

    运行官方demo,提示要微信开发者工具,导入路径出这玩意. 点击工具,设置,源码试图,把左边代码全部复制到右边, "weApp.devTools.path":"W:\\微 ...

  9. layui增加转圈效果

    var loadix = layer.load(1, {shade: [0.1,'#fff']}); layer.close(loadix);

  10. KNN算法实现对iris数据集的预测

    KNN算法的实现 import pandas as pd from math import dist k = int(input("请输入k值:")) dataTest = pd. ...