https://juejin.im/post/5c890f21f265da2d993dc692

CodeCache是热点代码的暂存区,经过即时编译器编译的代码会放在这里,它存在于堆外内存。除了JIT编译的代码之外,Java所使用的本地方法代码(JNI)也会存在codeCache中。

JVM内部会先尝试解释执行Java字节码,当方法调用或循环回边达到一定次数时,会触发即时编译,将Java字节码编译成本地机器码以提高执行效率。这个编译的本地机器码是缓存在CodeCache中的,如果有大量的代码触发了即时编译,而且没有及时GC的话,CodeCache就会被填满。

一旦CodeCache被填满,已经被编译的代码还会以本地代码方式执行,但后面没有编译的代码只能以解释执行的方式运行。

通过第2小节的比较,可以清晰看出解释执行和编译执行的性能差异。所以对于大多数应用来说,这种情况的出现是灾难性的。

JVM针对CodeCache提供了GC方式: -XX:+UseCodeCacheFlushing。在JDK1.7.0_4之后这个参数默认开启,当CodeCache即将填满时会尝试回收。JDK7在这方面的回收做的不是很少,GC收益较低,在JDK8有了很大的改善,所以可以通过升级到JDK8来直接提升这方面的性能。

在Java8中提供了一个JVM启动参数:-XX:+PrintCodeCache,他可以在JVM停止时打印CodeCache的使用情况,可以在每次停止应用时观察一下这个值,慢慢调整为一个最合适的大小。

通过在启动参数上增加:-XX:+UseCodeCacheFlushing 来启用;

打开这个选项,在JIT被关闭之前,也就是CodeCache装满之前,会在JIT关闭前做一次清理,删除一些CodeCache的代码

如果清理后还是没有空间,那么JIT依然会关闭。这个选项默认是关闭的;

在JDK8中,当以server模式启动时,分层编译默认开启。需要注意的是,分层编译方式只能用于server模式中,如果需要关闭分层编译,需要加上启动参数 -XX:-TieredCompilation;如果以client模式启动,-XX:+TieredCompilation 参数将会被忽略。

JIT编译器被停止了,并且不会被重新启动,此时会回归到解释执行;

被编译过的代码仍然以编译方式执行,但是尚未被编译的代码就 只能以解释方式执行了。
针对这种情况,JVM提供了一种比较激进的codeCache回收方式:Speculative flushing

在JDK1.7.0_4之后这种回收方式默认开启,而之前的版本需要通过一个启动参数来开启:-XX:+UseCodeCacheFlushing

在Speculative flushing开启的情况下,当codeCache将要耗尽时:

最早被编译的一半方法将会被放到一个old列表中等待回收;

在一定时间间隔内,如果old列表中方法没有被调用,这个方法就会被从codeCache充清除;

Code Cache满了时紧急进行清扫工作,它会丢弃一半老的编译代码;

Code Cache空间降了一半,方法编译工作仍然可能不会重启;

flushing可能导致高的cpu使用,从而影响性能下降;

JDK 8对codeCache的回收有了很明显的改善。不仅codeCache的增长比较平缓,而且当使用量达到75%时,回收力度明显加大,codeCache使用量在这个值上下浮动,并缓慢增长。最重要的是,JIT编译还在正常执行,系统运行速度也没有收到影响。

最新文章

  1. BZOJ1190[HNOI2007]梦幻岛宝石
  2. 另一种在WINFORM中使用XNA的方法
  3. asp.net GDI+绘制折线
  4. 16_AOP入门准备_动态代理模式
  5. linux常用20命令 --转载
  6. owncloud存储云服务搭建
  7. Azure 基础:使用 Traffic Manager 分流用户请求
  8. dedecms中{dede:myad name='about'/} 修改内容
  9. Linux svn checkout时候总报设备上没有空间
  10. 基于VMware Workstation在Windows Server 2008 R2上搭建SQL Server 2012高可用性组(AlwaysOn Group)测试环境(二)
  11. Ubuntu sudo apt-get 安装下载更新软件包命令详解
  12. 个人作业 Last
  13. BZOJ2843极地旅行社&BZOJ1180[CROATIAN2009]OTOCI——LCT
  14. gdb中信号
  15. lua -- debug
  16. 二分算法的应用——最大化最小值 POJ2456 Aggressive cows
  17. angularjs中ng-class的使用
  18. docker集群——初识Swarm
  19. centOS初了解--***安装node
  20. Eclipse用Runnable JAR file方式打jar包,并用该jar包进行二次开发

热门文章

  1. CentOS7上安装配置破解Elasticsearch+Kibana 6.4.2-6.5.1全过程
  2. P1141 01迷宫(连通块模板)
  3. Java不可变序列String和可变序列StringBuilder、StringBuffer
  4. AJAX得基本使用
  5. CDH管理节点扩容磁盘步骤
  6. 三校联训 小澳的葫芦(calabash) 题解
  7. 使用批处理选择运行控制台程序(简易cui)
  8. node(koa2)跨域与获取cookie
  9. 无法安装 Microsoft Visual Studio 2010 Service Pack 1,因为此计算机的状态不支持此安装。有关如何解决此问题的说明,请参阅 Microsoft 下载中心网站上的自述文件
  10. C#下载图片,用户选择保存路径