Java内联inline相关资料
Contents
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) ...
- Col1 : JVM 启动的时间, 单位 ms
- Col2 :
compile_id
- Col3 : 方法属性标志
Col4 :
tier
模式https://stackoverflow.com/questions/41134037/whats-this-new-column-in-xxprintcompilation-output
# 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
- Netty 维护者的 Blog : http://normanmaurer.me/blog/2014/05/15/Inline-all-the-Things/