我一直在对我的应用进行基准测试,并使用JMC对其进行分析。我注意到在负载下,它会执行大量的JIT编译。如果我每秒发送大量事务,则编译时间会增加。在针对该应用程序进行任何重负载测试时,编译时间始终会按比例增长。
我还观察到代码缓存也缓慢上升。因此,我决定将代码缓存的保留空间提高到500MB进行测试。不好的举动!现在,它花费更多的时间执行JIT。
然后,我通过-XX:-UseCodeCacheFlushing
明确禁用了代码缓存刷新。但是,我注意到峰值代码缓存使用率大于当前大小。这使我想到了两个问题:
答案 0 :(得分:2)
在HotSpot JVM中,所有JIT编译的方法都将保留在CodeCache中,直到它们被回收为止。 UseCodeCacheFlushing
影响冷(但仍然有效)编译方法的回收。但是,CodeCache也可能包含过时或无效的方法(“僵尸”),即使使用-XX:-UseCodeCacheFlushing
,这些方法也可能在下一个扫描周期中清除。
有一个单独的JVM标志-XX:-MethodFlushing
,可防止包括僵尸方法在内的所有代码缓存被完全清除。