簡體   English   中英

JVM JIT是否優化幾乎相等的新對象的創建?

[英]Does the JVM JIT optimises the creation of new objects that are almost equal?

我正在閱讀Functional Java庫的源代碼,並注意到了這一點:

public static <T> Option<T> none() {
    return new None<T>();
}

我想知道為什么它們不總是返回單例參數,特別是由於None的相等實現:

private static final class None<A> extends Option<A> { 

...

@Override
public int hashCode() {
    return 31;
}

@Override
public boolean equals(Object obj) {
   if (this == obj)
      return true;
   if (obj == null)
      return false;
   if (getClass() != obj.getClass())
      return false;
   return true;
}

}

因此,我在Functional Java的論壇上進行了搜索,發現了以下問題和答案:

是否可以進行設置,使其不會為每次對none的調用都創建一個新的None,我們可以在所有情況下使用單個對象表示None嗎?

不,但是,誰在乎呢? 現在,JIT優化器可以很好地處理這些事情。

我的問題是,JIT優化器如何以不必返回單例的方式處理此問題。 我知道對象創建很便宜,但是我認為單例會更便宜,在這種情況下,它不會增加任何復雜性。

不,我知道Java VM不執行這種優化。 使用現代JVM,創建新對象而不是尋找一些現有對象實際上更便宜。 它們在此FAQ中的含義還在於,壽命短,被丟棄的對象並不會真正影響垃圾收集時間(但可能會增加GC頻率)。 我還可以想象JVM執行轉義分析並在堆棧上而不是堆上分配此類對象。

但是我確實認為這很浪費。 查看Guava中的java.lang.Integer (和所有其他原始包裝器)緩存或Optional.absent()

public static <T> Optional<T> absent() {
  return (Optional<T>) Absent.INSTANCE;
}

在JDK中還有很多其他優化: enum是單例, Collections.emptyList()總是返回相同的實例,依此類推。

它更安全,否則我們需要依靠擦除。

創建對象可能比查找緩存的對象還要昂貴。 參見java8的Optional:

http://hg.openjdk.java.net/lambda/lambda/jdk/file/ad394630273b/src/share/classes/java/util/Optional.java

   43     private final static Optional<?> EMPTY = new Optional<>();

   63      * There is no guarantee that it is a singleton.

   69     @SuppressWarnings("unchecked")
   70     public static<T> Optional<T> empty() {
   71         return (Optional<T>) EMPTY;
   72     }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM