我们的服务运行在JDK17上,这是一个简单的存储查询服务,没有复杂的逻辑。 有时其rpc接口的TP9999可能会出现激增(从几十毫秒到几秒甚至十几秒),并伴随着100%的CPU利用率。
这种情况经常在运行稳定的机器上突然出现,几秒后就会自动恢复。
JFR在异常时刻发现了一些东西:
总会发生 JIT 去优化和重新编译,这 专注于JSON反序列化方法(我们的主要业务 逻辑是JSON反序列化)。
有时是C2编译器线程CPU过多 用法,而在其他时候是业务线程消耗 大量CPU。
我猜测JIT去优化可能会导致接口性能下降。 那么我应该如何解决或减少这个性能问题呢?
我只是通过删除分支预测逻辑解决了这个问题:
//-----------------------------branch_prediction-------------------------------
float Parse::branch_prediction(float& cnt,
BoolTest::mask btest,
int target_bci,
Node* test) {
return PROB_FAIR;
//float prob = dynamic_branch_prediction(cnt, btest, test);
// If prob is unknown, switch to static prediction
...
}