当前位置: 首页 > news >正文

JVM预热

阿里电商平台每年的各种大促活动,对于Java技术来说,其中重要一个操作环节就是预热操作。

目录

    • 预热是什么?
      • 为什么要预热?
    • java 程序不预热和预热的调用对比

预热是什么?

预热是指,在 JVM 启动后,JVM 刚刚启动后,我们并不会立即向调用方提供正常的流量,而是通过采用一些技术手段,通常是一些能跑到大部分case的测试流量对服务进行预热,直到服务能够按照预期的响应时间提供服务为止。此后才开始真正为调用方提供服务。

对比看下百度AI给出的开车预热。Java程序世界有类似之处
在这里插入图片描述

为什么要预热?

显然因为不预热,第一次访问将会比较慢,调用方无法接受。

为什么第一次访问慢?

OpenJDK 使用了 JIT(Just-in-time) 即时编译技术,可以动态的把 Java 字节码编译成高度优化过机器码,提高执行效率,但是,在编译之前,Java 代码是以相对低效的解释器模式执行的。(可以顺带复习下.class文件加载过程:https://doctording.blog.csdn.net/article/details/145503360)

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

  • 大量 Java 方法开始被 JIT 编译,请求处理很慢,线程可能大部分慢慢处理、有很多排队等待着、甚至有gc现象,最终的结果就是系统负载飙高,可能导致很多用户请求超时。
  • 极端情况:可能JVM服务一启动,立刻被高流量打死

参考:https://blog.csdn.net/crazymakercircle/article/details/132793889

java 程序不预热和预热的调用对比

预热的调用

预热通常包括以下步骤:

  • 多次执行:执行多次(例如1000次)相同的操作或方法调用,让JVM有时间进行代码优化。

  • 垃圾收集:在预热期间,可以触发垃圾收集,确保JVM的内存管理达到稳定状态。

  • 记录预热时间:记录预热所需的时间,这部分时间不计入实际性能测试中。

不预热:
在这里插入图片描述

预热:在这里插入图片描述

可以看到结果都是正确的,不预热耗时11,865,732ns, 预热是3,572,354ns 相差了3倍

附测试程序:

package warmup;


class Fibonacci {
    /**
     * 计算斐波那契数列:
     */
    public static long fib(int n) {
        if (n <= 1) {
            return n;
        }
        return fib(n - 1) + fib(n - 2);
    }
}


class TestNoWarmup {
    public static void test() {
        long startTime = System.nanoTime();
        long result = Fibonacci.fib(30); // 直接计算斐波那契数
        long endTime = System.nanoTime();
        System.out.println("TestNoWarmup Result: " + result);
        System.out.println("TestNoWarmup Time taken: " + (endTime - startTime) + "ns");
    }
}

class TestWithWarmup {
    public static void test() {
        // 预热阶段,执行多次以优化JIT编译
        for (int i = 0; i < 100; i++) {
            Fibonacci.fib(30); // 预热调用
        }
        // 正式测试阶段
        long startTime = System.nanoTime();
        long result = Fibonacci.fib(30); // 实际计算斐波那契数
        long endTime = System.nanoTime();
        System.out.println("TestWithWarmup Result: " + result);
        System.out.println("TestWithWarmup Time taken (excluding warmup): " + (endTime - startTime) + "ns");
    }
}

public class Test {
    public static void main(String[] args) {
//        TestNoWarmup.test();
        TestWithWarmup.test();
    }
}

相关文章:

  • Orcale、MySQL中参数类型的详解和运用场景(带示例)
  • 设计模式-Java
  • rknn 板端运行程序Invalid RKNN model version 6, Meet unsupported rknn target type
  • 答题卡识别阅卷系统(Matlab)
  • 【区块链】区块链密码学基础
  • 深度学习中的学习率调度器(lr_scheduler)详解:以 Cosine 余弦衰减为例(中英双语)
  • 内网穿透工具NPC(客户端以命令行方式连接详细教程)
  • 前端中的拖拽知识
  • SpringBoot项目实现用户token和资源的多重校验
  • 【面试系列】Java开发--AI常见面试题
  • 微信小程序项目 video 组件失效问题,无法播放本地视频
  • 大模型WebUI:Gradio全解12——LangChain原理及其agent构建Gradio(1)
  • Percona XtraDB Cluster (PXC) 8.0的搭建
  • 【狂热算法篇】探秘图论之 Floyd 算法:解锁最短路径的神秘密码(通俗易懂版)
  • 为什么在 TypeScript 中需要使用 import type?——以 Babylon.js 为例
  • 无人机仿真、感知、规划
  • 千峰React:函数组件使用(2)
  • GIS地图、轨道交通与智能驾驶UI设计:未来交通的智能化探索
  • TPU(Tensor Processing Unit)详解
  • nnUNet V2修改网络——加入MultiResBlock模块
  • 11家券商一季度净利翻番:9家利润超20亿,国泰海通居首
  • 家政阿姨如何炼成全国劳模?做饭、收纳、养老、外语样样都会
  • 七部门联合发布《终端设备直连卫星服务管理规定》
  • 来论|受美国“保护”,日本民众要付出什么代价?
  • 刘国中:毫不松懈巩固拓展脱贫攻坚成果,全力以赴抓好农业防灾减灾工作
  • 国家医保局副局长颜清辉调任人社部副部长