## 8.3 代码缓存 当JIT编译代码后,会放入一个叫代码缓存(CODE CACHE)的地方,这在JDK8 32位机器上,client模式下固定大小为32M, 64为机器上,大小为240M,代码缓存对性能影响非常重要,如果缓存不够,一些优化后的代码不得不被清空以让其他优化进入代码缓存 可以通过XX:+PrintFlagsFinal来打印平台所有参数默认值,比如,我的Mac机器行,有如下输出 ~~~ InitialCodeCacheSize = 2555904 ReservedCodeCacheSize = 251658240 CodeCacheExpansionSize = 65536 ~~~ 所示所示,代码缓存默认初始化大小为2555904字节,每次增长6536字节,代码缓存大小为251658240字节 -XX:+PrintCodeCache 用于打印代码缓存使用情况,这是在程序退出时候打印到控制台 ~~~ CodeCache: size=245760Kb used=1128Kb max_used=1147Kb free=244632Kb bounds [0x0000000106e00000, 0x0000000107070000, 0x0000000115e00000] total_blobs=291 nmethods=35 adapters=170 compilation: enabled ~~~ size 表示代码缓存大小,这并不是实际使用,这是一个最大值,used表示实际占用的大小,max_used比used大,表示实际占用的内存大小,需要参考这个指标作为设定Code Cache大小一句,free是`size-used`的值 当代码缓存满的时候,JIT通常会清理掉一部分Code Cache,这使用UseCodeCacheFlushing来控制 ~~~ UseCodeCacheFlushing = true ~~~ 可以使用XX:-UseCodeCacheFlushing 关闭自动清理,这样JIT将停止编译新的代码 > 另外一种清理Code Cache原因JIT认为优化认为是无效的,将会退出这部分优化代码,比如虚方法调用出现的逆优化,在8.6详细说明 可以通过`-XX:ReservedCodeCacheSize=*N*` 来设置代码缓存,通常不需要那么做,除非你通过打印代码缓存,认为CodeCache使用过大或者过小 ~~~ java -XX:ReservedCodeCacheSize=24960K ~~~ 显然,内联策略也会影响代码缓存大小,比如设置内联嵌套层次,最大的内联代码大小等,我们将在8.5一节详细说明