时间戳表示编译完成的时间,与该时间相对的是JVM启动时间。属性字符有多种:%表示栈上替换(方法后面的@2表示发生栈上替换的字节码索引);s表示编译同步方法;!表示方法存在异常处理器;b表示阻塞模式下发生的编译;n表示封装native方法所发生的编译。编译级别即分层编译的等级。方法大小表示Java字节码大小而非编译产出的机器代码大小。
如果发生退优化,需要撤销之前编译过的方法,这时候尾部会标注made not entrant(方法取消进入),或made zombie(僵尸代码)。产生made not entrant的原因可能是编译器的乐观假设被打破,或者发生了分层编译。如代码清单7-7所示,MemNode::main方法首先经过3级的C1编译,后续又经过4级的C2编译,此时C1产生的机器代码就会被标注为取消进入,但是方法仍然保留在CodeCache,直到该方法不被虚拟机及服务线程使用,也不被其他方法调用时,再将方法标注为made zombie。
编译神谕
编译神谕是指-XX:CompileCommand=subcommand,命令,通过它可以使用户控制虚拟机中即时编译器的行为。subcommand表示子命令,每个子命令都有特定的行为。