jvm调优之分层编译

详解JVM的即时编译 JVM之所以拥有强大的生态,是因为它是跨语言性的,JVM只识别字节码文件,不论是什么语言编写的代码,只要经过编译后能生成.class的字节码文件,JVM都可以进行解析。当然这些字节码文件都要符合JVM对于Class文件的格式定义,不能随便一个文件将后缀改成.classs就能行的。 像Groovy、Kotlin、Scala等语言,它们编译后生成的都是字节码文件,所以它们可以在JVM上运行。 字节码文件的内容除了一些常量池的一些信息外,其他基本都是每个方法中语句对应的字节码指令,像下面这样包含了部分main( 阅读详情

1 问题

     最近,在某个高QPS的服务在重启的时候,如图1.1所示,重启会load 非常高,出现尖刺,短信报警CPU使用率过高,然后一段时间负载就降下来。搜索下网络的文章,启动后高负载的原因大致是由于启动,随着代码的执行,jvm的jit编译器会将部分热点代码编译为目标机器代码,这时产生的编译线程会占用大量的cpu 导致系统负载高。但是通过top -H -p 查看编译线程的cpu 使用率,发现cpu 使用率比其他线程略高,但是没有明显差距,但是比较其他的请求线程,加在一起的cpu 使用率还是很可观。所以在此怀疑,JIT编译器需要代码执行一定的频率才会进行编译优化,系统刚启动的时候大部分的代码只是解释执行,解释执行的性能比编译执行的性能当然要差很多,所以系统的负载高,等到主要热点代码都是编译执行,系统负载就降下来。 那接下来如何对这个问题调优呢?

2  jvm  调优

  针对上面的问题,有两个解决方案:

  2.1 纯编译执行(-Xcomp)

     jvm提供了一个参数-Xcomp ,这个参数可以使jvm运行在纯编译的模式,所有的方法在第一次调用的时候就会编成机器代码,但是现实的话,设置了这个参数之后系统启动负载的确没有上升,这验证了我们之前的猜测,但是随之而来的问题,启动的时间是原来的两倍多,这对我们的应用是不好接受的,现在我们应用启动时间都快到3分钟。所以纯编译不是我们的最优选择。不过,我们还有分层编译。

2.2 分层编译(-XX:+TieredCompilation)

     除了纯编译和默认的mixed之外,jvm 从jdk6之后,引入了分层编译。HotSpot 内置两种编译器,分别是client启动时的c1编译器和server启动时的c2编译器,c2在将代码编译成机器代码的时候需要搜集大量的统计信息以便在编译的时候进行优化,因此编译出来的代码执行效率比较高,代价是程序启动时间比较长,而且需要执行比较长的时间,才能达到最高性能;与之相反, c1的目标是使程序尽快进入编译执行的阶段,所以在编译前需要搜集的信息比c2要少,编译速度因此提高很多,但是付出的代价是编译之后的代码执行效率比较低,但尽管如此,c1编译出来的代码在性能上比解释执行的性能已经有很大的提升,所以所谓的分层编译,就是一种折中方式,在系统执行初期,执行频率比较高的代码先被c1编译器编译,以便尽快进入编译执行,然后随着时间的推移,执行频率较高的代码再被c2编译器编译,以达到最高的性能。

3 效果

  线上环境一台机器加入分层编译参数-XX:+TieredCompilation之后,如图3.1效果很明显,在大多数情况下启动之后负载都不会升高,有时候即使有会升高,也比默认的恢复快很多。

JVM分层编译深度解析:完整机制与实践指南 JVM分层编译通过0-4层的精细化设计,构建了从"快速启动"到"极致优化"的完整性能演进路径。动态资源分配:根据代码热度分配编译资源,避免无效优化数据驱动优化:通过2层Profiling实现精准优化,提升优化效率弹性调整机制:通过去优化应对运行时变化,保证优化有效性理解分层编译机制,不仅有助于编写更易被JVM优化的代码(如减少过度复杂的分支、控制方法长度),更能针对特定场景制定有效的调优策略。对于大多数应用而言,保持默认配置即可获得最佳平衡,但在性能敏感场景下,有针对性的层级调整可进一步挖掘性能潜力。 阅读详情

相关推荐

JVM与性能调优:性能调优实战之JIT编译优化(9)

想象一位学徒厨师刚开始工作时,需要严格照着菜谱一步步操作(解释执行)。随着经验积累,他会记住常用菜品的做法(编译执行),甚至发展出自己的烹饪诀窍(优化编译)。JIT编译器正是这样一位"智能大厨",它让Java程序从笨拙的新手成长为高效的大师。您是否遇到过JIT优化导致的"神秘bug"(如去优化回退)?欢迎分享您与编译器斗智斗勇的故事。下期我们将探讨如何读懂编译器的"心思"——通过汇编输出分析优化效果。

caishuangxi111的博客 1107

阿里:深入探讨Java的分层编译

一开始接触到分层编译是因为我们这的服务每次发布/重启后都会短暂地出现CPU满线程池满的情况,然后过一段时间又能自动恢复。排查后发现是启动时JVM将部分热点代码编译为机器代码导致的,这个过程中JIT编译器会占用大量的CPU。一个Java的源代码文件变成可直接执行的机器指令,需要经过两段编译,第一段是把.java文件转换成.class文件。第二段是把.class文件转换为机器指令。第一段的编译相对固定,也就是将Java代码翻译为字节码并打包为jar的过程。

为无为,事无事,味无味。 1522

【JVM调优实战】35-JIT编译优化

本文是《JVM调优实战》专栏第 35 讲。

gaochufukanyongren的博客 15

JVM GC算法 CMS 详解(转)

前言 CMS,全称Concurrent Low Pause Collector,是jdk1.4后期版本开始引入的新gc算法,在jdk5和jdk6中得到了进一步改进,它的主要适合场景是对响应时间的重要性需求 大于对吞吐量的要求,能够承受垃圾回收线程和应用线程共享处理器资源,并且应用中存在比较多的长生命周期的对象的应用。CMS是用于对tenured generation的回收,也就是年老代的回收,目...

weixin_34259559的博客 1050

PIDNet实战:如何在Cityscapes数据集上实现93.2 FPS的实时语义分割(附完整训练代码)

本文提供了在Cityscapes数据集上实现实时语义分割模型PIDNet的完整工程实践指南。PIDNet凭借其独特的比例-积分-微分三分支架构,在CVPR 2023上取得了速度与精度的出色平衡。文章详细介绍了从环境配置、数据预处理、模型训练到性能优化与部署的全流程,并分享了实现93.2 FPS高推理速度的关键技巧与代码。

weixin_29047919的博客 375

BIOS/UEFI完全指南:从开机自检到超频魔改的底层硬件控制

计算机启动过程始于固件层,其核心是负责硬件初始化与引导的系统软件。传统BIOS基于16位实模式,寻址能力有限,而现代UEFI采用保护模式,支持图形界面与安全启动,实现了从概念到架构的革新。这一演进带来了显著的技术价值:更快的启动速度、更强的安全性以及对大容量存储设备的原生支持。在工程实践中,无论是解决“虚拟化技术禁用”问题、调整内存XMP配置以提升性能,还是为老主板“魔改”添加NVMe支持,都需要深入理解并操作BIOS/UEFI设置。掌握这些底层交互能力,是进行硬件调试、系统优化与故障排查的关键,也是连接抽

weixin_34236869的博客 459

jvm——分层编译

https://www.cnblogs.com/andy-zhou/p/5327288.html 分层编译根据编译器编译、优化的规模与耗时,划分出不同的编译层次: 第0层:程序解释执行,解释器不开启监控功能,已出发第一层编译 第1层:也称c1编译,将字节码编译成本地代码,进行简单可靠的代码(我理解的就是把class字节码变成c/c++编译出来的那种相对高效的native代码,可是为...

dengyunhui1210的博客 446

避开奸商套路!手把手教你用Thaiphoon Burner和CPU-Z,一眼看穿内存SPD信息有没有被篡改

本文教你使用Thaiphoon Burner和CPU-Z工具,快速识别内存SPD信息是否被篡改,避免购买到虚标频率或假冒颗粒的内存条。通过详细步骤和实战案例,帮助用户掌握内存检测技巧,确保硬件购买的透明度和安全性。

weixin_32228501的博客 685

深入JVM - JIT分层编译技术与日志详解

本文简要介绍了 JVM 中的分层编译技术。 包括两种类型的JIT编译器, 以及分层编译技术如何组合使用他们, 以达成最佳效果。 还详细介绍了5种不同的编译级别, 以及相关的JVM调优参数。 最后是一个具体的案例, 通过打印和分析编译日志, 深入学习了Java方法编译和优化的整个生命周期。

铁锚的优快云博客 3307

例题讲解拉格朗日乘子法、线性可分支持向量机(SVM)的推导

支持向量机(Support Vector Machine, SVM)的简单推导及例题

zzzssszzzzsz的博客 5684

高匿反爬实战:Python打造无痕爬虫,规避风控系统追踪

网络层匿踪:核心是使用住宅IP代理池,按真实用户IP画像匹配,控制请求频率;协议层匿踪:动态生成请求头(每次都不同),参数添加随机噪声,避免规律化;行为层匿踪:模拟人类的非规律行为(贝塞尔轨迹、随机停顿、非精准点击);设备层匿踪:伪造Canvas/WebGL指纹,禁用webdriver标识,每次请求更换指纹;核心原则:无痕爬虫的本质是“无限接近真实用户”,所有维度都要消除爬虫特征,而非单一维度伪装。打造真正的无痕爬虫需要全维度的匿踪策略,单一维度的伪装极易被高级风控系统识别。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 2643

Java分层编译,jvm调优之分层编译

1 问题最近,在某个高QPS的服务在重启的时候,如图1.1所示,重启会load 非常高,出现尖刺,短信报警CPU使用率过高,然后一段时间负载就降下来。搜索下网络的文章,启动后高负载的原因大致是由于启动,随着代码的执行,jvm的jit编译器会将部分热点代码编译为目标机器代码,这时产生的编译线程会占用大量的cpu 导致系统负载高。但是通过top -H -p 查看编译线程的cpu 使用率,发现cpu 使...

weixin_34405769的博客 595

【AIGC】大模型面试高频考点07-注意力(Attention)篇

AIGC面试高频考点

一个内容严谨、方向前沿、极具实践价值的AI大模型技术分享站 3363

【JVM技术】从底层架构到调优实战

本文介绍了JVM的核心架构与类加载机制。JVM作为Java程序的运行容器,通过五大核心模块(类加载子系统、运行时数据区、执行引擎、垃圾回收器和本地方法接口)实现跨平台执行和内存管理。文章重点解析了类加载的生命周期,包括加载、验证、准备、解析和初始化五个关键阶段,详细说明了每个阶段的功能特性与交互关系。JVM的自动内存管理和类加载机制既提供了高效稳定的运行环境,也带来了内存溢出、GC停顿等常见问题。理解这些核心原理对Java性能调优和问题排查具有重要意义。

独立思考,明辨是非 1139

SIMULINK开发项目实例 1000 例专栏之第802例--基于电机驱动系统的场景实例:永磁同步电机(PMSM)在电动汽车中的矢量控制仿真

随着全球对环境保护的关注增加,电动汽车(Electric Vehicle, EV)因其环保特性而受到广泛关注。永磁同步电机(Permanent Magnet Synchronous Motor, PMSM)由于其高效率、高功率密度和良好的动态响应性能,在电动汽车驱动系统中得到了广泛应用。矢量控制(Field-Oriented Control, FOC)是实现PMSM高性能控制的关键技术之一,它能够实现对电机转矩和磁场的独立控制,从而达到类似直流电机的控制效果。本文将详细介绍如何使用来构建一个。

xiaoheshang_123的博客 269

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

云原生时代的JVM调优:从被K8s暴打到优雅躺平

大家好,我是码哥,《Redis 高手心法》畅销书作者。在微服务与容器化技术主导的现代架构中,JVM 参数的配置已从传统的“经验预设”转向“动态感知”的工程化调优。尤其在 Kubernetes 等容器编排平台中,JVM 需要适应动态资源分配、高并发负载波动以及混合业务场景的复杂性。如何让 Java 应用在有限的资源约束下实现性能、稳定性与资源利用率的平衡?这需要从内存模型、编译策略到运行时环境的系统...

码哥字节 1447

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

JVM性能调优的基础知识 | JVM内部优化与运行时优化

对象逃逸的本质是对象指针的逃逸。在计算机语言编译器优化原理中,逃逸分析是指分析指针动态范围的方法,它同编译器优化原理的指针分析和外形分析相关联。当变量(或者对象)在方法中分配后,其指针有可能被返回或者被全局引用,这样就会被其他方法或者线程所引用,这种现象称作指针(或者引用)的逃逸(Escape)。通俗点讲,如果一个对象的指针被多个方法或者线程引用时,那么我们就称这个对象的指针(或对象)的逃逸(Escape)。逃逸分析,是一种可以有效减少Java 程序中同步负载和内存堆分配压力的跨函数全局数据流分析算法。

qq_74092815的博客 1532

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

troubleshoot之:GC调优到底是什么

我们经常会听到甚至需要自己动手去做GC调优。那么GC调优的目的到底是什么呢?让程序跑得更快?让GC消耗更少的资源?还是让程序更加稳定? 带着这些疑问来读一下这篇文章,将会得到一个系统的甚至是不一样的结果。

程序那些事 2万+

JVM 的 C1/C2 编译器

JVM 的 C1/C2 编译器负责将热点代码编译为高效机器码,提升 Java 程序性能。编译阈值 CompileThreshold 控制方法被编译的时机,影响启动速度与运行效率。分层编译机制结合了 C1 快速启动和 C2 高性能的优势,是现代 JVM 的默认模式。通过合理调节相关参数,可以根据应用场景优化 JVM 性能。如需针对实际项目给出具体调优方案,或更深入了解 JVM 内部机制,欢迎继续提问!

liu_rockefeller的博客 975

JVM 高级性能调优:从理论到生产实践

JVM 调优是每个 Java 开发者都应该掌握的技能。但调优不是盲目地修改参数,而是基于对应用特性的深入理解,有针对性地进行优化。

alex_goden的博客 3953

. Java虚拟机深度优化:JIT编译、垃圾回收器调优与低延迟服务设计

调优这些回收器,需精细设置堆大小(-Xms, -Xmx)、新生代与老年代比例、分区大小等,并密切监控GC日志(使用-XX:+PrintGCDetails),分析停顿时间、频率与内存回收效率,找到最适合当前服务负载的配置。例如,避免大量使用反射、频繁拆箱装箱,保持方法规模适中(便于内联优化),以及使用稳定的小型循环体,都有助于JIT识别并优化热点路径。尤其在微服务架构与低延迟场景下,对JVM进行深度优化,从即时编译(JIT)与垃圾回收(GC)两个核心维度进行精细调优,已成为构建高性能服务的关键。

miabha_641的博客 195

Java 性能天花板:JIT 即时编译、分层编译与代码缓存深度调优指南

JIT即时编译是Java性能优化的核心机制,本文深入解析了JIT的工作原理与优化技术。文章首先介绍了Java的双重执行模型,对比了解释执行与JIT编译的差异。重点讲解了分层编译机制,包括5个编译层级及其流转规则。针对代码缓存管理,详细说明了分段式架构和监控方法。通过JMH基准测试展示了方法内联、逃逸分析等核心优化技术的实际效果,其中方法内联性能提升10-20倍,逃逸分析优化可达50倍。最后提供了线上常见JIT问题的排查方案,强调JDK17默认参数已优化大部分场景,调优需基于监控数据。

果酱 の 博客 579
上一篇: 分布式事务LCN和seata对比
下一篇: HotSpot逃逸分析
西游却冻醒
博客等级 码龄11年 47粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值