验证编译器内联对象 creation/method 调用
Verify that compiler inlined object creation/method call
假设我有这样的代码:
public class InlineTest {
private String test() {
return "test";
}
public static void main(String[] args) {
System.out.println(
new InlineTest().test()
);
}
}
我知道 Java HotSpot 足够聪明,可以 inline 创建对象并调用 new InlineTest().test()
的方法。
但是我无法检查是否真的应用了内联!
Q 1:是否可以通过检查仅字节码来验证内联?怎么样?
如果不是一个选项:
Q 2:除了反汇编代码还有其他可能吗?
PS 我有 Java HotSpot(TM) 64-Bit Server VM (build 25.111-b14, mixed mode)
.
关于字节码:没有字节码级别的内联。
因此,通过反汇编该字节代码无法观察到任何东西。
关于 JIT 部分:参见 here for example (or theree for IBM java)。但是你必须明白,这些事情 取决于 你的 JVM 版本;据我所知,您无法使用任何方法来了解所有类型的 JVM(Oracle、IBM、Azuul 等)每个实现到底在做什么。
除此之外:请记住 JIT 高度动态。它可能不会 立即内联方法,但可能在稍后 时间点。这个想法是 JIT 根据 runtime 数据决定它将应用哪种优化。当 JIT 后来发现可能有 更好的 机器指令序列时,它甚至可能会返回并重新编译方法 ...
假设我有这样的代码:
public class InlineTest {
private String test() {
return "test";
}
public static void main(String[] args) {
System.out.println(
new InlineTest().test()
);
}
}
我知道 Java HotSpot 足够聪明,可以 inline 创建对象并调用 new InlineTest().test()
的方法。
但是我无法检查是否真的应用了内联!
Q 1:是否可以通过检查仅字节码来验证内联?怎么样?
如果不是一个选项:
Q 2:除了反汇编代码还有其他可能吗?
PS 我有 Java HotSpot(TM) 64-Bit Server VM (build 25.111-b14, mixed mode)
.
关于字节码:没有字节码级别的内联。 因此,通过反汇编该字节代码无法观察到任何东西。
关于 JIT 部分:参见 here for example (or theree for IBM java)。但是你必须明白,这些事情 取决于 你的 JVM 版本;据我所知,您无法使用任何方法来了解所有类型的 JVM(Oracle、IBM、Azuul 等)每个实现到底在做什么。
除此之外:请记住 JIT 高度动态。它可能不会 立即内联方法,但可能在稍后 时间点。这个想法是 JIT 根据 runtime 数据决定它将应用哪种优化。当 JIT 后来发现可能有 更好的 机器指令序列时,它甚至可能会返回并重新编译方法 ...