我们都知道Java中分配的每个对象都会在未来的垃圾收集周期中增加负担,而Optional<T>
对象也不例外。我们经常使用这些对象来包装可为空的值,这导致了更安全的代码,但代价是什么呢?
有没有人知道可选对象相比于简单返回空值所增加的额外GC压力以及这对高吞吐量系统性能的影响是什么?
我们都知道Java中分配的每个对象都会在未来的垃圾收集周期中增加负担,而Optional<T>
对象也不例外。我们经常使用这些对象来包装可为空的值,这导致了更安全的代码,但代价是什么呢?
有没有人知道可选对象相比于简单返回空值所增加的额外GC压力以及这对高吞吐量系统性能的影响是什么?
Optional
实例这样通常具有临时性质的对象。这甚至没有涉及JVM的优化器,如果逃逸分析已经证明对象是纯粹本地的,则优化器可能会在热点中消除对象分配。
Rectangle
实现,new Rectangle(0, 0, a, b).area()
可能会被优化为 a * b
,而无需分配任何内容。逃逸分析默认开启,所以没有太多要做,但其效率可能会受到一般设置(如 -XX:MaxInlineLevel
,-XX:MaxInlineSize
和 -XX:FreqInlineSize
)的影响,这些设置影响了优化器的视野,从而影响对象的生命周期长度,以便仍然保持“纯本地”。 - HolgerIterator
或Optional
返回类型)和“大量这样的临时对象”的区别,例如使用装箱元素的流而不是原始值。此外,“吞吐量”(总体性能)和“延迟”之间存在显着差异,这两个目标位于可用选项的不同端。通过正确调整,您可以在游戏循环中摆脱分配,但最好避免分配。 - Holger
Optional
对象存活多久?它们有多经常为空?当前垃圾回收器的压力有多大?所有这些都要考虑到。 - Joachim SauerOptional.empty()
是一个单例对象。因此,在实际使用中,它的成本不比null
更高。对于包含非空对象的 Optional 实例,尽管有一定的成本,但是这个成本非常低廉,只是该对象的一个简单包装器,其状态只包含对该对象的引用。在面向对象编程中,“对象中的对象”非常常见。对于轻量级类如Optional
来说,这应该永远不会成为问题。 - davidxxxOptional
的广泛使用,这本身可能表明没有什么大问题)。当然,您始终可以进行自己的测量。 - Ole V.V.