gpt4 book ai didi

java - JVM JIT 是否优化了几乎相等的新对象的创建?

转载 作者:行者123 更新时间:2023-11-30 07:19:24 25 4
gpt4 key购买 nike

我在阅读 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 的论坛上搜索了一下,找到了这个问题和答案:

Is it possible to set this up so it doesn't create a new None for every call to none, can we use a single object to represent None in all cases?

No, but then, who cares? The JIT optimiser can take care of these things quite well nowadays.

我的问题是 JIT 优化器如何以无需返回单例的方式处理此问题。我知道创建对象很便宜,但我认为单例会更便宜,在这种情况下它不会增加任何复杂性。

最佳答案

不,我知道的 Java 虚拟机不执行此类优化。使用现代 JVM,创建新对象比查找现有对象实际上更便宜。他们在本常见问题解答中的意思还在于,生命周期短的、丢弃的对象不会真正影响垃圾收集时间(但可能会增加 GC 频率)。我也可以想象 JVM 执行逃逸分析并将此类对象分配到堆栈而不是堆上。

但是我确实认为这是相当浪费的。查看 java.lang.Integer(以及所有其他原始包装器)缓存或 Optional.absent() in Guava :

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

在 JDK 中还有很多类似的优化:enum 是单例,Collections.emptyList()总是返回相同的实例等。

关于java - JVM JIT 是否优化了几乎相等的新对象的创建?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14715216/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com