jvm——CodeCache
https://juejin.im/post/5c890f21f265da2d993dc692
CodeCache是热点代码的暂存区,经过即时编译器编译的代码会放在这里,它存在于堆外内存。除了JIT编译的代码之外,Java所使用的本地方法代码(JNI)也会存在codeCache中。
JVM内部会先尝试解释执行Java字节码,当方法调用或循环回边达到一定次数时,会触发即时编译,将Java字节码编译成本地机器码以提高执行效率。这个编译的本地机器码是缓存在CodeCache中的,如果有大量的代码触发了即时编译,而且没有及时GC的话,CodeCache就会被填满。
一旦CodeCache被填满,已经被编译的代码还会以本地代码方式执行,但后面没有编译的代码只能以解释执行的方式运行。
通过第2小节的比较,可以清晰看出解释执行和编译执行的性能差异。所以对于大多数应用来说,这种情况的出现是灾难性的。
在Java8中提供了一个JVM启动参数:-XX:+PrintCodeCache,他可以在JVM停止时打印CodeCache的使用情况,可以在每次停止应用时观察一下这个值,慢慢调整为一个最合适的大小。
通过在启动参数上增加:-XX:+UseCodeCacheFlushing 来启用;
打开这个选项,在JIT被关闭之前,也就是CodeCache装满之前,会在JIT关闭前做一次清理,删除一些CodeCache的代码;
如果清理后还是没有空间,那么JIT依然会关闭。这个选项默认是关闭的;
-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编译还在正常执行,系统运行速度也没有收到影响。
最新文章
- BZOJ1190[HNOI2007]梦幻岛宝石
- 另一种在WINFORM中使用XNA的方法
- asp.net GDI+绘制折线
- 16_AOP入门准备_动态代理模式
- linux常用20命令 --转载
- owncloud存储云服务搭建
- Azure 基础:使用 Traffic Manager 分流用户请求
- dedecms中{dede:myad name='about'/} 修改内容
- Linux svn checkout时候总报设备上没有空间
- 基于VMware Workstation在Windows Server 2008 R2上搭建SQL Server 2012高可用性组(AlwaysOn Group)测试环境(二)
- Ubuntu sudo apt-get 安装下载更新软件包命令详解
- 个人作业 Last
- BZOJ2843极地旅行社&;BZOJ1180[CROATIAN2009]OTOCI——LCT
- gdb中信号
- lua -- debug
- 二分算法的应用——最大化最小值 POJ2456 Aggressive cows
- angularjs中ng-class的使用
- docker集群——初识Swarm
- centOS初了解--***安装node
- Eclipse用Runnable JAR file方式打jar包,并用该jar包进行二次开发
热门文章
- CentOS7上安装配置破解Elasticsearch+Kibana 6.4.2-6.5.1全过程
- P1141 01迷宫(连通块模板)
- Java不可变序列String和可变序列StringBuilder、StringBuffer
- AJAX得基本使用
- CDH管理节点扩容磁盘步骤
- 三校联训 小澳的葫芦(calabash) 题解
- 使用批处理选择运行控制台程序(简易cui)
- node(koa2)跨域与获取cookie
- 无法安装 Microsoft Visual Studio 2010 Service Pack 1,因为此计算机的状态不支持此安装。有关如何解决此问题的说明,请参阅 Microsoft 下载中心网站上的自述文件
- C#下载图片,用户选择保存路径