JVM-CodeCache


什么是CodeCache
JIT编译后的热点代码、JNI代码、JVM动态生成的代码 ,它们存放的地方,就是CodeCache

内部的数据结构:
方法区:保存JIT编译后的、jni、动态生成的代码
non-method区域,存放如编译器缓冲区和字节码解释器,这块区域是永远不会被回收的

JIT
热点代码优化

分层编译
Client:(使用C1编译器)编译速度快,但是效果一般
Server:(使用C2编译器)编译速度慢,但效果好
分层编译:client、server相结合,应用刚启动的时候,用client;运行过程中,不断使用Server进行优化
回边
针对循环体代码,JVM同样会进行热点代码的探测,识别是否可能存在热点代码,在JVM中,字节码中遇到控制流向后跳转的指令称为回边(BackEdge),JVM在方法中的循环体中添加回边计数器,执行次数超过阈值就认为是向编译器提交编译请求,触发OSR(On-Stack Replacement)编译。

注意:
1、一旦CodeCache达到了阈值,JVM将会切换到interpreted-only(解释执行)模式,字节码将不再会被编译成机器码。因此,应用程序将继续运行,但运行速度会降低一个数量级。
针对这种情况,可以通过参数-XX:+UseCodeCacheFlushing开启CodeCache自动清理机制,此时JVM会开始进行CodeCache区域的清理工作,卸载过期的旧code,以释放空间。

实践注意事项
1、一般应用不必关注JIT
2、大流量高并发的应用,可能存在瞬时流量过高,导致大量热点代码需要优化,进而JIT编译压力增加,造成性能下降
建议上线后,预估流量,先小流量切流,在JIT预热后,在放入大流量
3、如果CodeCache区域被占满,编译器被停用,字节码将不再会被编译成机器码,应用程序将继续运行,但运行速度会降低一个数量级,严重影响应用服务的运行
针对这种情况,可以通过参数-XX:+UseCodeCacheFlushing开启CodeCache自动清理机制(JVM8默认开启),此时JVM会开始进行CodeCache区域的清理工作,卸载过期的旧code,以释放空间。
code cache full一旦被处理,将会打印”CodeCache is full”的日志,但是这条日志只会打印一次:
Java HotSpot™ 64-Bit Server VM warning: CodeCache is full. Compiler has been disabled.
Java HotSpot™ 64-Bit Server VM warning: Try increasing the code cache size using -XX:ReservedCodeCacheSize=
Code Cache [0xffffffff77400000, 0xffffffff7a390000, 0xffffffff7a400000) total_blobs=11659 nmethods=10690 adapters=882 free_code_cache=909Kb largest_free_block=502656
具体什么时候会触发回收呢?这和CodeCacheMinimumFreeSpace有关
CodeCacheMinimumFreeSpace表示CodeCache的可用大小不足这个值的时候,就会停止进行JIT编译,并进行code cache full的处理逻辑,该参数的使用方式如下:-XX:CodeCacheMinimumFreeSpace=1M
默认情况下,在Liunx环境,该值的大小为500K。

4、导致CodeCache失效的其他原因:JVM的redefine和retrasnsform
如集团内部的青龙插件进行流量收集的时候,会进行插桩(redefine)

其他:redefine机制
redefine是jvm提供给开发人员用于动态修改方法内容的机制
arthas就是基于此机制实现的

即 Instrumentation 机制

参考
https://ata.atatech.org/articles/11000175618?layout=%2Fvelocity%2Flayout%2Fblank.vm
https://ata.atatech.org/articles/11000236414?spm=ata.23639746.0.0.44f9c466DpWzZG
● 【JVM系列六(JVM-codecache内存区域介绍】http://thinkhejie.github.io/2016/05/05/JVM系列_06/?spm=ata.21736010.0.0.d4807536xEiLkK
https://docs.oracle.com/javase/8/embedded/develop-apps-platforms/codecache.htm?spm=ata.21736010.0.0.d4807536xEiLkK


文章作者: 王利康
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 王利康 !
  目录