首页 > 其他分享 >【尼恩】JVM预热,你的方案是啥?

【尼恩】JVM预热,你的方案是啥?

时间:2024-11-20 17:07:31浏览次数:1  
标签:预热 服务 启动 流量 访问 JVM 尼恩

 

转发自:https://blog.csdn.net/crazymakercircle/article/details/132793889
尼恩老法师

 

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

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

首先,说说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、对外服务之前,通过合适的手段提前预热

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


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

 

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

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

 

 



 

标签:预热,服务,启动,流量,访问,JVM,尼恩
From: https://www.cnblogs.com/sxdcgaq8080/p/18558809

相关文章

  • JVM 场景面试题【强烈推荐】
    前言:前面系列文章让我们对JVM及垃圾回收相关的知识有了一个基本的了解,JVM的知识比较偏概念,当然也有一些底层的源码可以去研读,但多数来说我们了解了JVM的原理即可,本篇我们将基于前面分享的JVM相关的原理知识,提取一些JVM中场景的面试题,希望可以帮助到有需要的朋友。......
  • jvm堆外内存
    jvm的内存包含堆内存和堆外内存,所谓堆内存就是我们平常用-xms和-xmx控制的内存,而堆外内存分为几部分:元空间大小:元空间是用于存储类的元数据信息的区域,在JDK8之后替代了永久代。可以通过-XX:MetaspaceSize和-XX:MaxMetaspaceSize来设置初始大小和最大大小。例如:-XX:MetaspaceS......
  • JVM 内存分配的调优过程
    以一个创建1MB对象的接口来模拟万级并发请求产生大量对象的场景。@RequestMapping(value="/test1")publicStringtest1(HttpServletRequestrequest){List<Byte[]>temp=newArrayList<Byte[]>();Byte[]b=newByte[1024*1024];temp.add(b)......
  • 深入理解 JVM 垃圾回收算法
    前言上一篇我们对JVM的垃圾回收进行了探讨,知道了什么样的对象是垃圾对象,以及JVM虚拟机是如何判断一个对象垃圾对象的,本篇我们来探讨一下JVM垃圾回收算法。JVM系列文章传送门初识JVM(Java虚拟机)深入理解JVM(Java虚拟机)一文搞懂JVM垃圾回收(JVMGC)JVM有哪些垃......
  • JVM---JDBC案例是否真的打破了双亲委派机制的思考
    首先先来了解一下数据库驱动的加载过程:数据库驱动加载的过程我们先来看看Java中SPI定义的一个核心类:DriverManager,该类位于rt.jar包中,是Java中用于管理不同数据库厂商实现的驱动,同时这些各厂商实现的Driver驱动类,都继承自Java的核心类java.sql.Driver,如MySQL的com.mysql.c......
  • Java虚拟机JVM-程序计数器 讲解
    目录Java8的JVM内存结构程序计数器的功能程序技术器的具体细节class文件的字节码视图的内容程序计数器的特性Java8的JVM内存结构程序计数器的功能记录每个线程正在执行的字节码指令的地址,帮助JVM确定下一条需要执行的指令。程序技术器的具体细节class文件的......
  • JVM内存以及垃圾回收
    JVM基本概念线程JVM内存区域程序计数器(线程私有)虚拟机栈(线程私有)本地方法区(线程私有)堆(Heap-线程共享)-运行时数据区方法区/永久代(线程共享)JVM运行时内存新生代Eden区ServivorFromServivorToMinorGC的过程(复制->清空->互换)eden、ServivorFrom复制到ServivorTo,年龄+1清空......
  • Tomcat Windows 服务 JVM 内存参数设置
    Tomcat在Windows平台上启动服务的方式是CommonsDaemon,JVM的启动参数可以有多种设置方法。本文介绍CommonsDaemon的大致组成和参数设置方法。CommonsDaemon由两部分组成。一是由C语言开发负责和操作系统交互的平台相关程序,在Windows上平台相关部分是procrun,在Un......
  • Java虚拟机(JVM):Java程序的心脏
    Java虚拟机(JavaVirtualMachine,JVM)是Java运行时环境的核心组件,它不仅为Java程序提供了跨平台的能力,还负责内存管理、类加载、字节码解释与执行等重要功能。本文将深入探讨JVM的架构、内存划分、工作原理以及性能调优等方面的内容,帮助读者全面理解这一关键技术。一、JVM的架构......
  • 初识JVM,JVM自动内存管理
    文章目录一、前言1.1计算机==>操作系统==>JVM1.1.1虚拟与实体(对上图的结构层次分析)1.1.2Java程序执行(对上图的箭头流程分析)二、JVM内存空间与参数设置2.1运行时数据区2.2关于StackOverflowError和OutOfMemoryError2.2.1StackOverflowError2.2.2OutOfMemoryErr......