JIT 编译出来的机器码放在代码缓存里。它有多大、怎么分段、满了会怎样?这篇用 jcmd 看真实的分段使用量,再故意把它填满,量出 JIT 被关掉后新热点的代价。
[默认]
CodeHeap 'non-profiled nmethods': size=120032Kb used=57Kb max_used=57Kb free=119975Kb
CodeHeap 'profiled nmethods': size=120016Kb used=151Kb max_used=151Kb free=119864Kb
CodeHeap 'non-nmethods': size=5712Kb used=1241Kb max_used=1256Kb free=4470Kb
CodeCache: size=245760Kb, used=1449Kb, max_used=1464Kb, free=244309Kb
total_blobs=527, nmethods=139, adapters=297, full_count=0
[-XX:TieredStopAtLevel=1(只用 C1)]
CodeCache: size=49152Kb used=1883Kb max_used=1883Kb free=47268Kb
total_blobs=505, nmethods=136, adapters=297, full_count=0
[-XX:-SegmentedCodeCache]
CodeCache: size=245760Kb used=1465Kb max_used=1478Kb free=244294Kb
total_blobs=528, nmethods=140, adapters=297, full_count=0 [默认(ReservedCodeCacheSize = 240 MB)] 返回码 0
先测一次基准方法:9.43 ns/次
编译了 2500 个热方法之后,早就编译好的 bench 仍是:[9.57, 9.44, 9.44] ns/次
之后第一次用到的全新热方法 late(与 bench 同样规模的循环):第 1 轮 8.89 ns/次,第 2 轮 8.38 ns/次
[-XX:ReservedCodeCacheSize=6m] 返回码 0
先测一次基准方法:9.43 ns/次
编译了 2500 个热方法之后,早就编译好的 bench 仍是:[9.43, 9.45, 9.42] ns/次
之后第一次用到的全新热方法 late(与 bench 同样规模的循环):第 1 轮 9.90 ns/次,第 2 轮 8.41 ns/次
[-XX:ReservedCodeCacheSize=6m -XX:-UseCodeCacheFlushing] 返回码 0
先测一次基准方法:9.44 ns/次
[3.218s][warning][codecache] CodeCache is full. Compiler has been disabled.
[3.218s][warning][codecache] Try increasing the code cache size using -XX:ReservedCodeCacheSize=
CodeCache: size=6144Kb used=6117Kb max_used=6132Kb free=26Kb
编译了 2500 个热方法之后,早就编译好的 bench 仍是:[9.48, 9.53, 9.43] ns/次
之后第一次用到的全新热方法 late(与 bench 同样规模的循环):第 1 轮 240.13 ns/次,第 2 轮 239.27 ns/次
OpenJDK 64-Bit Server VM warning: CodeCache is full. Compiler has been disabled.
OpenJDK 64-Bit Server VM warning: Try increasing the code cache size using -XX:ReservedCodeCacheSize=ReservedCodeCacheSize = 251658240(240.0 MB) InitialCodeCacheSize = 2555904(2.4 MB) NonNMethodCodeHeapSize = 5839564(5.6 MB) NonProfiledCodeHeapSize = 122909338(117.2 MB) ProfiledCodeHeapSize = 122909338(117.2 MB) SegmentedCodeCache = true UseCodeCacheFlushing = true CodeCacheExpansionSize = 65536 ReservedCodeCacheSize = 251658240(240.0 MB)