JVM inline 相关的参数

# 获取所有 inline 匹配的参数
java -XX:+PrintFlagsFinal -version | grep -i "inline"

# 如果生成的 native code 大小小于这个, 则 inline
-XX:InlineSmallCode=2000

# 最大允许进行 inline 的 byte code 大小. 超过的话, 会提示 too big
-XX:MaxInlineSize=35

# 经常被调用的方法的进行 inline 的最大 byte code 大小
-XX:FreqInlineSize=325

# 最大 inline 的调用层级. 超过的话, 会提示 inlining too deep
-XX:MaxInlineLevel=9

# 一个方法被 inline 的最小调用次数
-XX:MinInliningThreshold=250

# JVM 判断一个方法是否是 hot . 被调用 1W 次
## https://stackoverflow.com/questions/18345089/what-does-compilethreshold-tier2compilethreshold-tier3compilethreshold-and-tie
## java -XX:+PrintFlagsFinal -version | grep -i "CompileThreshold"
-XX:CompileThreshold=10000

输出的日志格式

https://gist.github.com/rednaxelafx/1165804#file-notes-md

# JVM 参数  -XX:+PrintCompilation -XX:+UnlockDiagnosticVMOptions -XX:+PrintInlining

col1 col2 col3 col4 java.lang.String::equals (81 bytes) ...
# C1, 当 byte code >  MaxInlineSize * NestedInliningSizeRatio(90%) 时报
# 一般为 > 31.5 byte 时报
callee is too large

# C2, 当 byte code > MaxInlineSize 或 > FreqInlineSize
hot method too big 或 too big

改进

重点关注 hot method too big 的代码. 一般可以用 cat console.log | grep "hot" | grep "big" | grep "你的包名" 来搜索出来. 类似如下

cat console.log | grep "hot" | grep "big" | grep "company"
@ 3   com.company.listener.RedisMessageListener::onMessage (691 bytes)   hot method too big