Java编译机制

本文介绍了Java的编译执行机制,包括解释执行、编译执行的优缺点,以及查询运行模式。重点讲解了Hotspot的C1和C2即时编译器,分层编译的概念,以及方法内联的策略和可能遇到的问题。内容涵盖了从解释执行到编译执行的全过程,并提供了相关的JVM参数调整建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

解释执行(interperted)

优势在于没有编译等待时间
性能相对差一些

编译执行(complied)

运行效率会高很多,一般认为比解释执行快一个数量级
带来了额外开销

查询运行模式

java -version
-Xint:设置jvm执行模式解释执行模式
-Xcomp:Jvm优先以编译模式运行,不能编译的,以解释模式运行。
-Xmixed:混合模式运行

Hotspot的即时编译器-C1

C1编译器:
是一个简单快速的编译器
主要关注局部性优化
适用于执行时间较短或对启动性能有要求的程序,例如,GUI应用对界面启动速度就有一定要求
也被称为是Client Complier

Hotspot的即时编译器-C2

C2编译器:
是为长期运行的服务端应用程序做性能调优的编译器
适用于执行时间较长或对峰值性能有要求的程序
也被称之为Server Complier

分层编译

0:解释执行
1:简单C1编译,会用C1编译器进行一些简单的优化,不开启Profiling(性能监控)
2:受限的C1编译,仅执行带有方法调用次数以及循环回边执行次数的C1编译
3:完全C1编译,会执行带有所有Profiling的C1代码
4:C2编译,使用C2编译器进行优化,该级别会启用一些编译耗时较长的优化,一些情况下会根据性能监控信息进行一些非常激进的性能优化
级别越高,应用启动越慢,优化开销越高,峰值性能也越高

方法内联

条件:
方法足够小
热点方法:如果方法体小于325字节会尝试内联可用-XX:FreqInlineSize修改大小
非热点方法:如果方法体小于35字节,会尝试内联可用-XX:MaxInlineSize修改大小
被调用方法运行时的实现被可以唯一确定
static方法、private 方法以及final方法,JIT可以唯一确定具体的实现代码
public的实例方法,指向的实现可能是自身、父类、子类的代码,当且仅当JIT唯一确定方法的具体实现时,才有可能完成内联

方法内联可能带来的问题

CodeCache的溢出,导致JVM退化成解释执行模式

内联相关的jvm参数

参数名默认说明
-XX:+PrintInlining-打印内联详情,该参数需要和-XX:+UnlockDiagnosticVMOptions配合使用
-XX:+UnlockDiagnosticVMOptions-打印JVM诊断相关的信息
-XX:MaxInlineSize=n35如果非热点方法的字节码超过该值,则无法内联,单位字节
-XX:FreqInlineSize=n325如果热点方法的字节码超过该值,则无法内联,单位字节
-XX:InlineSmallCode=n1000目标编译后生成的机器码代销大于该值无法内联单位字节
-XX:MaxInlineLevel=n9内联方法的最大调用帧数嵌套调用的最大内联深度
-XX:MaxTrivialSize=n6如果方法的字节码少于该值,则直接内联,单位字节
-XX:MinInliningThreshold=n250如果目标方法的调用次数低于该值,则不去内联
-XX:LiveNodeCountInliningCutoff=n40000编译过程中最大活动字节数(IR节点)的上限,仅对C2编译器有效
-XX:InlineFrequencyCount=n100如果方法的调用点(call site)的执行次数超过该值,则出发内联
-XX:MaxRecursiveInlineLevel1递归调用大于这么多次数就不内联
-XX:+InlineSynchronizedMethods开启是否允许内联同步方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值