微博一面: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,请到下面公号【技术自由圈】取↓↓↓

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/74747.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker 和 podman的区别

Podman 和 Docker 都是用于容器化应用程序的工具,它们在很多方面非常相似,但也有一些关键区别: 1. 架构和权限: - Docker:Docker 使用守护进程(dockerd)来管理容器,它需要在操作…

TortoiseGit设置作者信息和用户名、密码存储

前言 Git 客户端每次与服务器交互,都需要输入密码,但是我们可以配置保存密码,只需要输入一次,就不再需要输入密码。 操作说明 在任意文件夹下,空白处,鼠标右键点击 在弹出菜单中按照下图点击 依次点击下…

侧边栏的文章分类、热门文章和热门文章的展示(Go 搭建 qiucode.cn 之九)

早就有言,秋码记录 虽早已不是原来的面貌,但这终究是不防碍我们使用golang来搭建它。 而又为什么是使用golang呢?并非是其他编程语言呢?想必 时候回答【我为什么要学习 Go 语言(golang)】这个问题了 已经给出了答案! 当然,当初学习golang时,不单单是为了搭建一个博客应…

【数据结构】二叉树基础入门

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃个人主页 :阿然成长日记 …

makefile之目标文件生成

目标文件:源码经过编译还没有链接那些中间文件.linux .o文件 gcc $(CFLAGS) -c xxx.c -o xx.o include Makefile.config SRC : $(wildcard *.c wildcard ./audio_module/*.c) SRC_OBJ $(patsubst %.c,%.o,$(SRC))all:$(SRC_OBJ) $(info contents $(SRC))$(info objfiles $(SR…

获取板块分类并展示

板块分类也会变动,偶尔看下,利于总体分析大盘 https:dapanyuntu.com/ 该网站含有板块信息 分析接口 搜素关键字 拷贝curl到curl解析工具,去掉无用的参数,生成requests代码 尝试nginx反代接口 server {listen 443;loca…

数据结构算法-分而治之算法

引言 在茫茫人海中找寻那个特定的身影,犹如在浩瀚的星海中寻找那一颗独特的星辰。小森,一个平凡而真实的男孩,此时正在人群中寻找他的朋友,温迪。 小森运用了一种“分而治之”的算法策略,将周围的人群分成两组&#…

算法通关村第十九关——动态规划是怎么回事(青铜)

算法通关村第十九关——动态规划是怎么回事(青铜) 前言1 什么是动态规划2 动态规划的解题步骤3 简单入门3.1 组合总和3.2 最小路径和3.3 三角形最小路径和 4 理解动态规划 前言 动态规划是一种解决复杂问题的算法思想,它将一个大问题分解为多…

Spring Boot 中使用 Poi-tl 渲染数据并生成 Word 文档

本文 Demo 已收录到 demo-for-all-in-java 项目中,欢迎大家 star 支持!后续将持续更新! 前言 产品经理急冲冲地走了过来。「现在需要将按这些数据生成一个 Word 报告文档,你来安排下」 项目中有这么一个需求,需要将用户…

eNSP基本命令大全

单交换机VLAN划分 进入系统视图 system 进入系统视图 system-view 退到系统视图 quit 删除vlan 20 undo vlan 20 交换机命名 sysname 显示vlan disp vlan 创建vlan(也可进入vlan 20) vlan 20 把端口1-5放入VLAN 20 中 port e1/0/1 to e1/0/5 显示vlan里的端口20 disp v…

【JavaEE】_CSS引入方式与选择器

目录 1. 基本语法格式 2. 引入方式 2.1 内部样式 2.2 内联样式 2.3 外部样式 3. 基础选择器 3.1 标签选择器 3.2 类选择器 3.3 ID选择器 4. 复合选择器 4.1 后代选择器 4.2 子选择器 4.3 并集选择器 4.4 伪类选择器 1. 基本语法格式 选择器若干属性声明 2. 引入…

【数据结构】AVL树的插入与验证

文章目录 一、基本概念1.发展背景2.性质 二、实现原理①插入操作1.平衡因子1.1平衡因子的更新1.1.1树的高度变化1.1.2树的高度不变 2. 旋转2.1左旋2.2右旋2.3右左双旋2.4 左右双旋 ②验证1.求二叉树高度2. 判断是否为AVL树 源码总结 一、基本概念 1.发展背景 普通的二叉搜索树…

el-form表单动态校验(场景: 输入框根据单选项来动态校验表单 没有选中的选项就不用校验)

el-form表单动态校验 el-form常规校验方式: // 结构部分 <el-form ref"form" :model"form" :rules"rules"><el-form-item label"活动名称: " prop"name" required><el-input v-model"form.name" /…

2023 最新 Git 分布式版本控制系统介绍和下载安装使用教程

Git 基本概述 Git 是一个开源的分布式版本控制系统&#xff0c;用于敏捷高效地处理任何或大或小的项目。 集中式和分布式的区别&#xff1f; 最常见的集中式版本控制系统是SVN&#xff0c;版本库是集中放在中央处理器中的&#xff0c;而干活的时候&#xff0c;用的都是自己电…

第15章_瑞萨MCU零基础入门系列教程之Common I2C总线模块

本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写&#xff0c;需要的同学可以在这里获取&#xff1a; https://item.taobao.com/item.htm?id728461040949 配套资料获取&#xff1a;https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总&#xff1a; ht…

postman和node.js的使用

一 nodejs下载 下载链接&#xff1a; nodejs官网&#xff1a; https://nodejs.org/zh-cn/download 我使用的windows .msi安装方式&#xff0c;双击一直下一步就行 当前安装完成后的版本&#xff1a;1.下载 2.安装步骤 下载完成后&#xff0c;双击安装包&#xff0c;开始安装&…

win10自带wifi共享功能

1、按下【wini】组合键打开windows设置&#xff0c;点击【网络和internet】&#xff1b; 2、按照下图&#xff0c;打开个移动热点&#xff0c;设置名称、密码。

python列表合并,去重

目录 python列表合并&#xff0c;set去重方法,无序 列表合并去重&#xff0c;保留顺序 python列表合并&#xff0c;set去重方法,无序 在 Python 中&#xff0c;如果你想向列表添加元素并去重&#xff0c;你可以使用集合&#xff08;set&#xff09;来实现。集合是一个无序的元…

[linux] mmcv-full 安装的时候 Building wheel 卡住

&#xff08;已解决&#xff09;FileNotFoundError: [Errno 2] No such file or directory: ‘:/usr/local/cuda-11.8/bin/nvcc‘_鳗小鱼的博客-CSDN博客 安装mmcv一直卡在建车轮_梦想成为大佬的王老八的博客-CSDN博客 pip install -U openmim mim install mmcv

appium+jenkins实例构建

自动化测试平台 Jenkins简介 是一个开源软件项目&#xff0c;是基于java开发的一种持续集成工具&#xff0c;用于监控持续重复的工作&#xff0c;旨在提供一个开放易用的软件平台&#xff0c;使软件的持续集成变成可能。 前面我们已经开完测试脚本&#xff0c;也使用bat 批处…