JIT Compiler是否要优化局部变量
Is the JIT Compiler going to optimize local variables
Java JIT 编译器是否会优化此代码:
Class2 method() {
Class foo = new Class();
Class2 bar = new Class2();
if (foo.variable == null)
throw new RuntimeException();
bar.otherVariable = 5;
return bar;
}
通过这样做:
Class2 method() {
Class foo = new Class();
if (foo.variable == null)
throw new RuntimeException();
Class2 bar = new Class2();
bar.otherVariable = 5;
return bar;
}
是内存使用的优化。何时创建 Class2 并为其分配内存?
与大多数事情一样,答案是 'it depends'。
首先,Java 编译器不会为您重新排序。字节码将与您布置的一样。
其次,JIT会在重复调用时调用。在经过多次(10,000 次)执行之前,它不会经过高级 JIT 编译。
如果您重复调用此方法并且字段始终作为 null 传递,那么它可能会优化函数以删除其余代码,这反过来将执行无用代码消除并省略构造。
另一方面,如果 class 执行了一些可见的副作用(例如设置全局系统 属性、创建线程、分配静态值),则代码不会不能完全省略。它可能内联对象创建并有效地替换该构造函数。
但是,可能值得注意的是,即使 JIT 没有优化它,创建一个立即可用于 GC 的新实例也是一个非常便宜的操作。分配是内存数组的一个碰撞指针,虽然可能会发生一些字段初始化,但它会在几乎肯定在缓存中很热的内存中占用少量时间。当此方法 returns 时 class 将符合 GC 条件并且可以被删除(假设没有终结器等)
Java JIT 编译器是否会优化此代码:
Class2 method() {
Class foo = new Class();
Class2 bar = new Class2();
if (foo.variable == null)
throw new RuntimeException();
bar.otherVariable = 5;
return bar;
}
通过这样做:
Class2 method() {
Class foo = new Class();
if (foo.variable == null)
throw new RuntimeException();
Class2 bar = new Class2();
bar.otherVariable = 5;
return bar;
}
是内存使用的优化。何时创建 Class2 并为其分配内存?
与大多数事情一样,答案是 'it depends'。
首先,Java 编译器不会为您重新排序。字节码将与您布置的一样。
其次,JIT会在重复调用时调用。在经过多次(10,000 次)执行之前,它不会经过高级 JIT 编译。
如果您重复调用此方法并且字段始终作为 null 传递,那么它可能会优化函数以删除其余代码,这反过来将执行无用代码消除并省略构造。
另一方面,如果 class 执行了一些可见的副作用(例如设置全局系统 属性、创建线程、分配静态值),则代码不会不能完全省略。它可能内联对象创建并有效地替换该构造函数。
但是,可能值得注意的是,即使 JIT 没有优化它,创建一个立即可用于 GC 的新实例也是一个非常便宜的操作。分配是内存数组的一个碰撞指针,虽然可能会发生一些字段初始化,但它会在几乎肯定在缓存中很热的内存中占用少量时间。当此方法 returns 时 class 将符合 GC 条件并且可以被删除(假设没有终结器等)