△Hollis, 一个对Coding有着独特追求的人△

这是Hollis的第 391 篇原创分享

作者 l Hollis

来源 l Hollis(ID:hollischuang)

不知道大家有没有遇到过类似的问题,应用在刚刚启动之后,前几次访问都会比较卡顿,RT都会比极高,在运行一段时间之后,就会顺畅很多了。

这背后的原因是什么呢?

今天给大家介绍一种可能的原因,也是一种经常被别人忽略的原因,也是我们线上环境遇到过很多次的问题,那就是和JIT有关的。

JIT编译

我们知道,想要把高级语言转变成计算机认识的机器语言有两种方式,分别是编译和解释,虽然Java转成机器语言的过程中有一个步骤是要编译成字节码,但是,这里的字节码并不能在机器上直接执行。

所以,JVM中内置了解释器(interpreter),在运行时对字节码进行解释翻译成机器码,然后再执行。

解释器的执行方式是一边翻译,一边执行,因此执行效率很低。为了解决这样的低效问题,HotSpot引入了JIT技术(Just-In-Time)。

有了JIT技术之后,JVM还是通过解释器进行解释执行。但是,当JVM发现某个方法或代码块运行时执行的特别频繁的时候,就会认为这是“热点代码”(Hot Spot Code)。然后JIT会把部分“热点代码”翻译成本地机器相关的机器码,并进行优化,然后再把翻译后的机器码缓存起来,以备下次使用。

这也是HotSpot虚拟机的名字的由来

那么,这和我们今天要讲的问题有啥关系呢?

大家理解了JIT编译的原理之后,其实可以知道,JIT优化是在运行期进行的,并且也不是Java进程刚一启动就能优化的,是需要先执行一段时间的,因为他需要先知道哪些是热点代码。

所以,在JIT优化开始之前,我们的所有请求,都是要经过解释执行的,这个过程就会相对慢一些。

而且,如果你们的应用的请求量比较大的的话,这种问题就会更加明显,在应用启动过程中,会有大量的请求过来,这就会导致解释器持续的在努力工作。

一旦解释器对CPU资源占用比较大的话,就会间接的导致CPU、LOAD等飙高,导致应用的性能进一步下降。

这也是为什么很多应用在发布过程中,会出现刚刚重启好的应用会发生大量的超时问题了。

而随着请求的不断增多,JIT优化就会被触发,这就是使得后续的热点请求的执行可能就不需要在通过解释执行了,直接运行JIT优化后缓存的机器码就行了。

如何解决

那么,怎么解决这样的问题呢?

主要有两种思路:

1、提升JIT优化的效率

2、降低瞬时请求量

在提升JIT优化效率的设计上,大家可以了解一下阿里研发的JDK——Dragonwell。

这个相比OpenJDK提供了一些专有特性,其中一项叫做JwarmUp的技术就是解决JIT优化效率的问题的。

这个技术主要是通过记录Java应用上一次运行时候的编译信息到文件中,在下次应用启动时,读取该文件,从而在流量进来之前,提前完成类的加载、初始化和方法编译,从而跳过解释阶段,直接执行编译好的机器码。

除了针对JDK做优化之外,还可以采用另外一种方式来解决这个问题,那就是做预热。

很多人都听说过缓存预热,其实思想是类似的。

就是说在应用刚刚启动的时候,通过调节负载均衡,不要很快的把大流量分发给他,而是先分给他一小部分流量,通过这部分流量来触发JIT优化,等优化好了之后,再把流量调大。

总结

本文介绍了一下JIT优化的时机以及原理,我们今天讨论的问题不是JIT优化导致的,而JIT优化的出现恰恰是要解决这样的问题的。

但是这个知识点却和JIT优化息息相关。或者说有些问题JIT优化并没办法彻底解决,我们可以帮助JIT优化做一些优化。

技术交流群

最近有很多人问,有没有读者交流群,想知道怎么加入。

最近我创建了一些群,大家可以加入。交流群都是免费的,只需要大家加入之后不要随便发广告,多多交流技术就好了。

目前创建了多个交流群,全国交流群、北上广杭深等各地区交流群、面试交流群、资源共享群等。

有兴趣入群的同学,可长按扫描下方二维码,一定要备注:全国 Or 城市 Or 面试 Or 资源,根据格式备注,可更快被通过且邀请进群。

▲长按扫描

往期推荐
我开源的软件只能我拿来赚钱92年清华本科,做了30年技术,43岁在CTO的位置上被优化!找了一年多工作,有些迷茫!360变相裁员!以代打卡为由强行裁员,不给赔偿!

如果你喜欢本文,

请长按二维码,关注 Hollis.

转发至朋友圈,是对我最大的支持。

点个 在看 

喜欢是一种感觉

在看是一种支持

↘↘↘

阿里终面:为什么应用刚启动的时候比较卡,过一会就好了?相关推荐

  1. 阿里云服务器 window server tomcat启动 并且关闭window防火墙 配置8080端口开放还是没用

    阿里云windows server  服务器开放端口 1.远程服务器关闭windows防火墙   不需要开放端口 2.阿里云管理平台开放指定的端口  如8081 阿里云服务器   window ser ...

  2. 解决eclipse刚启动卡死的问题~~~亲测有效~~

    解决eclipse刚启动卡死的问题~~~亲测有效~~ 重启了eclipse三次,还是卡死了.最后找到一下方法: 建议大家在删除先备份一下文件,以免丢失项目! 关于 eclipse启动卡死的问题(ecl ...

  3. 阿里“看”AI + “ET大脑”战略启动

    11月13日,2017杭州云栖大会还在继续,在阿里云ET大脑峰会现场,阿里技术委员会主席王坚就阿里对AI价值观做出了最直接的阐述. 王坚表示,人的智能,是人类发现的第一个智能,而且它的不同之处在于大家 ...

  4. 1对1直播源码刚启动时出现空白的解决方案

    做1对1直播源码启动的时候发现,点击icon之后会出现一个短暂的白屏的界面,再进入第一个activity,后来查了资料才发现,是因为Them的原因,默认背景是白色的所以解决方案就是给activiy加个 ...

  5. 我们有一个线上的项目,刚启动完就占用了超过 1.5G,一次大量 JVM Native 内存泄露的排查分析(64M 问题)

    我们有一个线上的项目,刚启动完就占用了使用 top 命令查看 RES 占用了超过 1.5G,这明显不合理,于是进行了一些分析找到了根本的原因,下面是完整的分析过程,希望对你有所帮助. 会涉及到下面这些 ...

  6. 钟雅涵:端午魔咒?黄金牛市刚启动,原油摇旗冲新高

    钟雅涵:端午魔咒?黄金牛市刚启动,原油摇旗冲新高 每个交易者最害怕的交易困局:每过一段时间,无论我们怎么做,都亏,顺势也亏,逆势也亏,做震荡也亏,短线也亏,做趋势也亏,怎么做怎么亏......我们前期 ...

  7. 跑跑卡丁车刚进入游戏时很卡,跑一圈或两圈后就不卡了?

    刚才在顺网论坛看到版主发贴解释这一问题,想到自己也曾经遇到过,于是把问题原因在这里说下,可能我找到的只是表面现象,但是按照我的办法可以很快的解决卡的问题. 当时出现刚进游戏跑第一圈或第二圈的时候画面很 ...

  8. 【踩坑记录】Gazebo启动慢,画面卡“Preparing your world”

    项目场景: ros kinetic 问题描述: 启动gazebo慢,卡顿,一直停留在Preparing your world的界面上 原因分析: gazebo在启动时需要将模型仿真出来,又因为模型不存 ...

  9. ev3与java_创建一个可启动EV3的SD卡(以便使用Java/lejos)

    本帖最后由 ntwuhui 于 2013-9-27 00:46 编辑 QQ图片20130920080305.jpg (31.53 KB, 下载次数: 193) 2013-9-20 08:04 上传 T ...

最新文章

  1. CPU/GPU/TPU/NPU...XPU都是什么意思?
  2. 计算机组成原理的中央控制器,计算机组成原理第六章中央控制器(6-7,8,9).pdf
  3. python环境变量配置_21 python环境的配置
  4. OpenStack运维(二):OpenStack计算节点的故障和维护
  5. 遵循Java EE标准体系的开源GIS服务平台之三:数据发布与访问
  6. java 对象快速赋值_JavaWeb学习笔记:简单JavaBean对象的快速赋值与获取
  7. dubbo入门级梳理
  8. paraview用户指南
  9. rip的metric策略
  10. nodejs 视频教程《一起学nodejs》
  11. 简单 sql 语句 实用大全
  12. 章节分割器 v2.0 Beta0618 版
  13. 计算机防火墙不能更改,win7无法更改防火墙设置提示系统报错怎么办
  14. 英语入门文章阅读第一篇
  15. autojs编写的网易云音乐和视频搜索脚本源代码免费分享开源
  16. EntityFrameWork Core从零开始,(九)继承影射的补充
  17. 解决问题spring加载配置文件aop:before 报错: Cannot create inner bean '(inner bean)' of type...
  18. Linux下安装无线网卡驱动
  19. 休闲娱乐 - PS4游戏 Journey 风之旅人
  20. php爬虫全国地址信息

热门文章

  1. C++|Qt中QTreeWidget基本操作及完整代码下载
  2. python字典文件,python-文件转字典,字典转文件
  3. Ubuntu 20.10 安装 fcitx5 输入法
  4. transporter上传卡正在交付_Xcode11,Transporter上传卡在——正在验证 APP - 正在通过App Store进行认证...
  5. c语言程序实际问题,《编程解决问题之程序规划语言(c语言)》.doc
  6. java if和else if的区别_关于C语言中if,elseif和else的区别在哪里
  7. 怎样格式化电脑_硬盘数据销毁最安全的步骤是怎样的?有公司可以做吗
  8. JS学习笔记5-JavaScript 变量
  9. 二进制指数类型退避算法
  10. Linux查看网络连接数,统计网络连接数(netstat、Apache连接数)