我一直在对我的应用程序进行基准测试并使用 JMC 对其进行分析。我注意到在负载下,它会执行相当多的 JIT 编译。如果我每秒发送大量事务,编译时间就会激增。编译时间总是随着对应用程序的任何重负载测试成比例地增长。
我还观察到代码缓存也在缓慢上升。所以我决定将 Code Cache 预留提高到 500MB 进行测试。坏动作!现在它花费更多的时间来执行 JIT。
然后我通过-XX:-UseCodeCacheFlushing
. 但是,我注意到峰值代码缓存使用量大于当前大小。这让我想到了几个问题:
- JVM 是否尝试缓存每个 JIT 编译?
- 为什么即使我禁用了刷新,峰值代码缓存大小仍大于当前大小?
- 函数结束后是否有“临时”编译代码自动删除?