JVM预热

news/2025/2/23 13:19:16

阿里电商平台每年的各种大促活动,对于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();
    }
}


http://www.niftyadmin.cn/n/5863430.html

相关文章

(二)趣学设计模式 之 工厂方法模式!

目录 一、 啥是工厂方法模式&#xff1f;二、 为什么要用工厂方法模式&#xff1f;三、 工厂方法模式怎么实现&#xff1f;四、 工厂方法模式的应用场景五、 工厂方法模式的优点和缺点六、 总结 &#x1f31f;我的其他文章也讲解的比较有趣&#x1f601;&#xff0c;如果喜欢博…

Unity贴图与模型相关知识

一、贴图 1.贴图的类型与形状 贴图类型 贴图形状 2.在Unity中可使用一张普通贴图来生成对应的法线贴图&#xff08;但并不规范&#xff09; 复制一张该贴图将复制后的贴图类型改为Normal Map 3.贴图的sRGB与Alpha sRGB&#xff1a;勾选此选项代表此贴图存储于Gamma空间中…

蓝桥杯真题 - 缴纳过路费 - 题解

题目链接&#xff1a;https://www.lanqiao.cn/problems/19736/learning/ 个人评价&#xff1a;难度 2 星&#xff08;满星&#xff1a;5&#xff09; 前置知识&#xff1a;并查集 整体思路 按边权从小到大处理&#xff0c;将处理过的边的两个端点合入一个并查集中&#xff1b…

深入解析设计模式之单例模式

深入解析设计模式之单例模式 在软件开发的复杂世界里&#xff0c;设计模式是开发者手中的得力工具&#xff0c;它们是对常见问题的总结和通用解决方案。单例模式作为其中一种基础且常用的设计模式&#xff0c;在各类应用中扮演着重要角色。 一、单例模式的定义与概念 单例模…

CNewMenu::QueryContextMenu函数分析之新建菜单项的创建

CNewMenu::QueryContextMenu函数分析之新建菜单项的创建 第一部分&#xff1a; HRESULT CNewMenu::QueryContextMenu(HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags) { // if they want the default menu only (CMF_DEFAULTONLY) OR //…

靶场之路-Kioptix Level-1 mod_ssl 缓冲区溢出漏洞

声明 学习视频来自B站UP主 泷羽sec,如涉及侵泷羽sec权马上删除文章笔记的只是方便各位师傅学习知识,以下网站涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 一、准备工作 首先使用 vmware 导入靶机文件&#xff0c; 然后网络模式改成 nat 模式即可 我们打…

Open WebUI选择模型为空,解决办法(for DeepSeek)

标签&#xff1a; DeepSeek&#xff1b; Open WebUI&#xff1b; 问题&#xff1a;Open WebUI选择模型为空&#xff0c;解决办法 &#xff08;for DeepSeek&#xff09; 操作系统&#xff1a;Ubuntu 22 硬件&#xff1a;台式电脑 Ubuntu 22系统&#xff0c;DeepSeek安装成功&…

使用 WebGL 和 React Three Fiber 实现的粒子流体流动特效

在Web 开发中粒子系统广泛应用于各种动画效果和数据可视化场景。本文将介绍如何使用 WebGL 和 React Three Fiber 实现一个高效的 GPU 粒子系统。通过利用 GPU 的并行计算能力,我们可以在不牺牲性能的情况下实现复杂的粒子动画。 粒子动画 1,项目结构 项目的目录结构: in…