微博一面:JVM预热,你的方案是啥?

说在前面

在40岁老架构师 尼恩的读者社区(50+)中,最近有小伙伴拿到了一线互联网企业如微博、阿里、汽车之家、极兔、有赞、希音、百度、网易、滴滴的面试资格,遇到一几个很重要的面试题:

  • JVM预热,你的方案是啥?
  • Springboot应用,如何做预热?

这里,尼恩给大家做一下系统化、体系化的梳理,使得大家可以充分展示一下大家雄厚的 "技术肌肉",让面试官爱到 "不能自已、口水直流"

也一并把这个题目以及参考答案,收入咱们的 《尼恩Java面试宝典》V107版本,供后面的小伙伴参考,提升大家的 3高 架构、设计、开发水平。

《尼恩 架构笔记》《尼恩高并发三部曲》《尼恩Java面试宝典》的PDF,请到公号【技术自由圈】获取

文章目录

首先,说说JVM预热的重要性

为啥需要 JVM 预期?

一般情况下,在 Java 服务刚刚启动,处理的第一个请求的响应速度,往往会比正常情况下的请求要慢很多,

通常情况下,处理的第一个请求的响应速度,延迟时间会达到几百毫秒,甚至有可能达到 1 秒。

如果我们的下游调用方服务设定了超时限制,那么在JVM服务刚启动的阶段,由于响应速度较慢,有很大的可能引发超时异常,影响服务的正常运行。

极端情况:当突发流量非常大,可能JVM服务一启动,立刻被高流量打死,而且永远也启动不起来,甚至会造成整个系统的雪崩。

所以,要做JVM预热。

那么,为啥第一次请求慢?

OpenJDK 使用了 JIT(Just-in-time) 即时编译技术,可以动态的把 Java 字节码编译成高度优化过机器码,提高执行效率,但是,在编译之前,Java 代码是以相对低效的解释器模式执行的

在应用启动完成后、业务流量刚进来的短时间内,容易出现的状况是:

大量 Java 方法开始被 JIT 编译,同时业务请求被较慢的解释器模式执行,最终的结果就是系统负载飙高,可能导致很多用户请求超时。

极端情况:可能JVM服务一启动,立刻被高流量打死

JVM 预热方案

什么是 JVM 预热?

预热是指,在 JVM 启动后,JVM 刚刚启动后,我们并不会立即向调用方提供正常的流量,而是通过采用一些技术手段,先用较小的流量对服务进行预热warmup,直到服务能够按照预期的响应时间提供服务为止。

预热方案有目前以下手段:

  • 1、通过流量控制来进行预热
  • 2、在服务启动并正常可供访问之前,可以让服务自行进行预热,具体可以通过以下几种方式实现
  • 3、在发布系统中,我们可以配置一个访问 URL 列表,让发布系统在服务启动前进行预热

1、通过流量控制来进行预热:

1)利用网关的流量控制功能,根据新服务上线的时间,给予不同的访问权重。这样,服务能够逐步达到正常访问的热度,避免因为流量过大导致服务崩溃。

2)使用sentinel等组件进行warmup限流,在服务刚上线时,将过高的流量直接拦截,防止对服务造成过大的压力,确保服务的稳定运行。

3)spring的ribbon组件策略改造,使其流量控制策略与网关的流量控制策略保持一致。这样,可以更好地协调各个组件之间的流量控制,提高服务的预热效果。

2、对外服务之前,通过合适的手段提前预热

在服务启动并正常可供访问之前,可以让服务自行进行预热,具体可以通过以下几种方式实现:

1)设定初始化的预热模块,在服务启动后自行遍历重要的访问接口:

  • a. 服务开发者可以在编写代码时,设计一个初始化预热模块,该模块在服务启动后会自动执行。
  • b. 在这个初始化模块中,可以编写逻辑来遍历所有的重要访问接口,这样在服务启动后,就能对这些接口进行预热。
  • c. 这种方式能够确保服务在启动后的早期阶段,就对重要的访问接口进行了遍历,提高了服务的响应速度和稳定性。

2)运用测试工具组件,如 Java Microbenchmark Harness(JMH),在服务启动后遍历访问接口:

  • a. 通过使用 JMH 这样的测试工具组件,可以在服务启动后模拟真实访问请求,对服务进行预热。
  • b. 这种做法有助于在服务启动后迅速遍历所有访问接口,从而提高服务的响应速度和稳定性。
  • c. 同时,可以利用 JMH 的性能测试功能,对预热效果进行评估,进一步优化预热策略。

3、阿里的开源项目龙井替换 JDK,在服务启动时自动加载应加载的类:

  • a. 通过使用龙井项目,可以在服务启动时自动加载需要加载的类,从而在服务启动早期对这些类进行预热。
  • b. 这种方式可以有效地缩短服务启动后的预热时间,提高服务的响应速度和稳定性。
  • c. 此外,龙井项目还可以实现类加载的优化,例如按需加载、并行加载等,从而提高预热效率。

阿里龙井使用手册

作者介绍

本文1作: Andy,资深架构师, 《Java 高并发核心编程 加强版 》作者之1 。

本文2作: 尼恩,40岁资深老架构师, 《Java 高并发核心编程 加强版 卷1、卷2、卷3》创世作者, 著名博主 。 《K8S学习圣经》《Docker学习圣经》等11个PDF 圣经的作者。

参考文献

https://blog.csdn.net/Weixiaohuai/article/details/125391957

https://www.cnblogs.com/daoqidelv/p/7043696.html

https://blog.csdn.net/qq_39149842/article/details/118995017

清华大学出版社《Java高并发核心编程 卷2 加强版》

推荐阅读

百亿级访问量,如何做缓存架构设计

多级缓存 架构设计

消息推送 架构设计

阿里2面:你们部署多少节点?1000W并发,当如何部署?

美团2面:5个9高可用99.999%,如何实现?

网易一面:单节点2000Wtps,Kafka怎么做的?

字节一面:事务补偿和事务重试,关系是什么?

网易一面:25Wqps高吞吐写Mysql,100W数据4秒写完,如何实现?

亿级短视频,如何架构?

炸裂,靠"吹牛"过京东一面,月薪40K

太猛了,靠"吹牛"过顺丰一面,月薪30K

炸裂了...京东一面索命40问,过了就50W+

问麻了...阿里一面索命27问,过了就60W+

百度狂问3小时,大厂offer到手,小伙真狠!

饿了么太狠:面个高级Java,抖这多硬活、狠活

字节狂问一小时,小伙offer到手,太狠了!

收个滴滴Offer:从小伙三面经历,看看需要学点啥?

《尼恩 架构笔记》《尼恩高并发三部曲》《尼恩Java面试宝典》PDF,请到下面公号【技术自由圈】取↓↓↓

相关推荐
2401_8576100313 分钟前
Spring Boot框架:电商系统的技术优势
java·spring boot·后端
希忘auto30 分钟前
详解MySQL安装
java·mysql
冰淇淋烤布蕾41 分钟前
EasyExcel使用
java·开发语言·excel
拾荒的小海螺1 小时前
JAVA:探索 EasyExcel 的技术指南
java·开发语言
Jakarta EE1 小时前
正确使用primefaces的process和update
java·primefaces·jakarta ee
马剑威(威哥爱编程)1 小时前
哇喔!20种单例模式的实现与变异总结
java·开发语言·单例模式
用户3157476081351 小时前
成为程序员的必经之路” Git “,你学会了吗?
面试·github·全栈
看山还是山,看水还是。1 小时前
Redis 配置
运维·数据库·redis·安全·缓存·测试覆盖率
谷新龙0011 小时前
Redis运行时的10大重要指标
数据库·redis·缓存
java—大象1 小时前
基于java+springboot+layui的流浪动物交流信息平台设计实现
java·开发语言·spring boot·layui·课程设计