Neo Anderson's Blog

Java 即时编译相关词汇

字数统计: 391阅读时长: 1 min
2020/10/24

援引:《深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)》
https://pan.baidu.com/s/1yRNwG7_Fp61OAPWmtfvv2g 密码: 2bes

关键名词:

  • JEP JDK Enhancement Proposals(JDK增强建议)
  • IR: Intermediate Representation(中间表达形态)
  • HIR: Higher Intermediate Representation
  • LIR: Lower Intermediate Representation
  • SSA: Static Single Assignment(静态单赋值)
  • 窥孔优化:
  • 寄存器分配:

关键参数:

  • -XX:+TieredCompilation:开启分层编译,JDK8 之后默认开启
  • -XX:+CICompilerCount=N:编译线程数,设置数量后,JVM 会自动分配线程数,C1:C2 = 1:2
  • -XX:TierXBackEdgeThreshold:OSR 编译的阈值
  • -XX:TierXMinInvocationThreshold:开启分层编译后各层调用的阈值
  • -XX:TierXCompileThreshold:开启分层编译后的编译阈值
  • -XX:ReservedCodeCacheSize:codeCache 最大大小
  • -XX:InitialCodeCacheSize:codeCache 初始大小
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package com.neoadensce.jitpractice;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class JavacInTime {

private static Logger logger = LoggerFactory.getLogger(JavacInTime.class);

private static JavacInTime javacInTimeInstance;

public static void main(String[] args){
javacInTimeInstance = new JavacInTime();
javacInTimeInstance.beforeJavac();
javacInTimeInstance.afterJavac();
}

private void beforeJavac(){
logger.info("\n前端编译");
logger.info(String.format("\n%s\n%s\n%s\n", "词法分析","语法分析","语义分析"));
logger.info("\n产出IR");
}

private void afterJavac(){
logger.info("\n后端编译");
logger.info("\n热点字节码翻译为机器码");

logger.info("\n分层编译");
logger.info(String.format("\n%s\n%s\n%s\n%s\n%s\n", "解释执行","执行不带profiling的C1代码","执行仅带方法调用次数以及循环回边执行次数profiling的C1代码","执行带所有profiling的C1代码","执行C2代码"));
}
}
CATALOG