在Java中,当你可以导致性能差异时,是否使用短期对象而不是长期存在的对象? (内存使用,速度或两者)
这样做之间的性能确实存在差异:
MyClass object = new MyClass();
object.my_method();
或者这个:
new MyClass().my_method();
谢谢!
答案 0 :(得分:0)
您提供的示例与对象的生命没有任何区别。真正的区别在于您已命名保存对象引用的变量。对于第二种情况,代码将具有一个将保存该指针的匿名变量。 (也就是说,堆栈上会有一个存储指针的空间,但由于它没有名称,你无法访问它。)
在某个理论层面,当命名变量在范围内时,垃圾收集可能会发生冲突,这可能会产生微观差异,但这种可能性很小。
根据我的经验,你不应该担心这些之间的性能差异,而应该仅仅根据可读性做出这样的决定。该变量的声明在代码执行方面的差异微不足道。如果您需要一个命名变量,请使用它,就像没有开销一样,即使您只使用一次该变量。如果代码在没有变量的情况下从可读性角度来看更清晰,那就把它留下来。
答案 1 :(得分:0)
如果您希望使用短生命对象获得一些性能,则应使用最终声明。在您的示例中:
final MyClass object = new MyClass();
object.my_method();
这是对JVM的一个暗示,如果它感觉就可以优化它,你的第二个例子与JVM的视图大致相同。然而,无法保证它会发生,因为它取决于太多因素来强制执行它。
真正的长寿命对象是那些被创建一次然后重复使用很长时间的对象(如果可能的话,程序的整个实时时间)。在实际使用它们的代码中没有立即获得性能(除了通常的JVM优化之外),但GC不必收集它们,并且不必发生GC运行是为了保存执行时间更重要的代码。但由于GC速度非常快,因此只需要在内部循环和其他频繁执行的代码中执行此操作。