首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JIT编译器是否会优化局部变量

JIT编译器是否会优化局部变量
EN

Stack Overflow用户
提问于 2021-04-09 18:43:35
回答 1查看 64关注 0票数 0

Java JIT编译器是否会优化以下代码:

代码语言:javascript
复制
Class2 method() {
     Class foo = new Class();
     Class2 bar = new Class2();

     if (foo.variable == null)
        throw new RuntimeException();

     bar.otherVariable = 5;
     return bar;
}

通过这样做:

代码语言:javascript
复制
Class2 method() {
     Class foo = new Class();

     if (foo.variable == null)
        throw new RuntimeException();

     Class2 bar = new Class2();
     bar.otherVariable = 5;

     return bar;
}

它是内存使用的优化。何时创建Class2并分配其内存?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-13 23:27:58

与大多数事情一样,答案是“视情况而定”。

首先,Java编译器不会为您重新排序。字节码将与您的布局相同。

其次,当这个函数被重复调用时,JIT将被调用。在经过多次(10,000)执行之前,它不会经过高级JIT编译。

如果你在字段总是作为null传入的情况下重复调用它,那么它将优化函数以删除剩余的代码,这反过来将执行死代码消除并省略构造。

另一方面,如果您拥有的类执行了一些可见的副作用(例如,设置全局系统属性、创建线程、分配静态值),那么代码将不会被完全省略。它可以内联对象创建,并有效地替换该构造函数。

然而,可能值得注意的是,即使JIT不对其进行优化,创建一个可立即用于GC的新实例也是一个非常便宜的操作。分配是一个内存数组的凹凸指针,虽然可能会发生一些字段初始化,但它将在内存中,几乎肯定是高速缓存中的热点,并占用少量的时间。当此方法返回时,类将符合GC的条件,并且可以直接删除(假设没有终结器等)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67019643

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档