问题:
项目刚启动时,发现代码执行的巨慢,通过查看线程发现:
有一个C2 compileThread0的线程占用了很大的cpu。进一步查询发现了一个jvm的特性,
C2 Compiler 是JVM在server模式下字节码编译器,JVM启动的时候所有代码都处于解释执行模式,当某些代码被执行到一定阈值次数,这些代码(称为热点代码)就会被 C2 Compiler编译成机器码,编译成机器码后执行效率会得到大幅提升。
流量进来后,大部分代码成为热点代码,这个过程中C2 Compiler需要频繁占用CPU来运行,当大部分热点代码被编译成机器代码后,C2 Compiler就不再长期占用CPU了,这个过程也可以看作抖动。
解决办法:
1. 模拟预热,服务预热之后再开始接受请求
2. -XX:CICompilerCount=threads参数,设置编译器的数量,server模式默认为2,client模式默认为1
但是线程数更大也并不一定能解决问题。