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