在Java中,新旧本地之间是否存在性能差异?

an0*_*00b 2 java performance garbage-collection new-operator

在C和C++中,我知道在堆栈上实例化对象与使用"new"在堆上创建对象之间的性能可能会有很大差异.

这在Java中是一样的吗?

Java中的"new"运算符非常方便(特别是当我不必记住释放/删除使用"new"创建的对象时),但这是否意味着我可以疯狂地使用'new'?

Bri*_*ach 6

嗯,java中没有其他方法来实例化对象.

创建所有对象new,并在堆上创建所有对象.

在Java中,当你说

MyObject foo;
Run Code Online (Sandbox Code Playgroud)

你只是声明一个变量(引用).直到你说,它才会被实例化

foo = new MyObject();
Run Code Online (Sandbox Code Playgroud)

当对该对象的所有引用都超出范围时,该对象变得易于垃圾收集.你会注意到deletejava中没有这样的东西:)


Joa*_*uer 6

Java中没有在堆栈上分配对象.

只有局部变量(和参数)可以存在于堆栈中,并且那些只能包含引用或原始值,但绝不能包含对象.


Pet*_*rey 5

您无法在堆栈上创建对象,您只能在堆栈上具有基元和引用,因此该问题不适用于Java.

已经尝试使用转义分析来优化短暂的对象(并且可能将它们放在堆栈上)但是我没有看到任何证据表明这种改进的性能.

与C/C++不同的性能命中/好处的部分原因是Java在堆上具有线程本地分配,并且对象不会像往常一样被回收.C/C++具有线程本地堆栈,但您需要其他库以支持多线程对象分配.物体被更具侵略性地回收,这增加了物体分配的成本.

来自C/C++世界的最大变化之一是发现Java具有更少的功能,但尝试充分利用它们(JVM中有很多复杂的优化)另一方面Java有一个丰富/令人困惑的开源库.