编译级别有:
0:解释代码
1:简单C1编译代码
2:受限的C1编译代码
3:完全C1编译代码
4:C2编译代码
典型的编译日志可以显示,多数方法第一次编译的级别是3,即完全C1编译。(当然,所有方法都从级别0开始。)如果方法运行得足够频繁,它就会编译成级别4(级别3的代码就会被丢弃)。最常见的情况是:client编译器从获取了代码如何使用的信息进行优化时才开始编译。
如果server编译器队列满了,就会从server队列中取出方法,以级别2进行编译,在这个级别上,C1编译器使用方法调用计数器和回边计数器(但不需要性能分析的反馈信息)。这使得方法编译得更快,而方法也将在C1编译器收集分析信息之后被编译为级别3,最终当server编译器队列不太忙的时候被编译为级别4。
另一方面,如果client编译器全忙,原本排程在级别3编译的方法就既可以等待级别3编译,也适合进行级别4的编译。在这种情况下,方法编译会很快转到级别2,然后由级别2转到级别4。
那些不太重要的方法可以从级别2或级别3开始编译,但随后会因为它们的重要性没那么高而转为级别1。另外,如果server编译器出于某些原因无法编译代码,也会转为级别1。
当然,代码在逆编译时会转为级别0。
有些标志可以控制某些级别转换行为,但调优能够得到很乐观的结果。当方法按期望的顺序,即级别0→级别3→级别4编译时,性能可以达到最优。如果方法经常被编译为级别2,并且还额外有可用的CPU周期,那就可以考虑增加编译器的线程数,从而减少server编译器队列的长度。如果没有额外可用的CPU周期,那你唯一能做的就是尽力减小应用的大小。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。