jvm分层编译级别

编译级别有:
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周期,那你惟一能作的就是尽力减少应用的大小。server

相关文章
相关标签/搜索