码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 微博一面:JVM预热,你的方案是啥?


    说在前面

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

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

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

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

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

    文章目录

      • 说在前面
      • 首先,说说JVM预热的重要性
      • 那么,为啥第一次请求慢?
      • JVM 预热方案
        • 1、通过流量控制来进行预热:
        • 2、对外服务之前,通过合适的手段提前预热
        • 3、阿里的开源项目龙井替换 JDK,在服务启动时自动加载应加载的类:
      • 作者介绍
      • 参考文献
      • 推荐阅读

    首先,说说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,请到下面公号【技术自由圈】取↓↓↓

  • 相关阅读:
    GNSS及其定位原理,差分GNSS技术分析
    【JVM技术专题】 深入分析class字节码指令方法调用详解「原理篇」
    基于 FPGA 实现数字时钟详细原理讲解及验证结果
    php定时任务
    冒泡排序代码
    VB.NET三层之用户查询窗体
    阅读mybatis的源码的思路
    第一讲 递归和递推
    python dingding --- 钉钉机器人API
    【Java技术路线】9. Spring MVC
  • 原文地址:https://blog.csdn.net/crazymakercircle/article/details/132793889
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号