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并分配其内存?
发布于 2021-04-13 23:27:58
与大多数事情一样,答案是“视情况而定”。
首先,Java编译器不会为您重新排序。字节码将与您的布局相同。
其次,当这个函数被重复调用时,JIT将被调用。在经过多次(10,000)执行之前,它不会经过高级JIT编译。
如果你在字段总是作为null传入的情况下重复调用它,那么它将优化函数以删除剩余的代码,这反过来将执行死代码消除并省略构造。
另一方面,如果您拥有的类执行了一些可见的副作用(例如,设置全局系统属性、创建线程、分配静态值),那么代码将不会被完全省略。它可以内联对象创建,并有效地替换该构造函数。
然而,可能值得注意的是,即使JIT不对其进行优化,创建一个可立即用于GC的新实例也是一个非常便宜的操作。分配是一个内存数组的凹凸指针,虽然可能会发生一些字段初始化,但它将在内存中,几乎肯定是高速缓存中的热点,并占用少量的时间。当此方法返回时,类将符合GC的条件,并且可以直接删除(假设没有终结器等)。
https://stackoverflow.com/questions/67019643
复制相似问题