在Java中,new和local之间是否存在性能差异? 在C和C++中,我知道栈上实例化对象与使用“新”在堆上创建对象之间的性能可能有很大的差异。

在Java中,new和local之间是否存在性能差异? 在C和C++中,我知道栈上实例化对象与使用“新”在堆上创建对象之间的性能可能有很大的差异。,java,performance,garbage-collection,new-operator,Java,Performance,Garbage Collection,New Operator,在Java中也是这样吗 Java中的“new”操作符非常方便(特别是当我不必记得释放/删除用“new”创建的对象时),但这是否意味着我可以随意使用“new”?Erm,Java中没有其他方法来实例化对象 所有对象都是使用new创建的,所有对象都是在堆上创建的 在Java中,当你说 MyObject foo; 您只需声明一个变量(引用)。直到你说 foo = new MyObject(); 当对该对象的所有引用都超出范围时,该对象就可以进行垃圾收集。您会注意到java中没有delete)在jav

在Java中也是这样吗


Java中的“new”操作符非常方便(特别是当我不必记得释放/删除用“new”创建的对象时),但这是否意味着我可以随意使用“new”?

Erm,Java中没有其他方法来实例化对象

所有对象都是使用
new
创建的,所有对象都是在堆上创建的

在Java中,当你说

MyObject foo;
您只需声明一个变量(引用)。直到你说

foo = new MyObject();

当对该对象的所有引用都超出范围时,该对象就可以进行垃圾收集。您会注意到java中没有
delete

在java中堆栈上没有对象分配


只有局部变量(和参数)可以存在于堆栈上,并且这些变量只能包含引用或基元值,而不能包含对象。

您不能在堆栈上创建对象,只能在堆栈上包含基元和引用,因此该问题不适用于Java

有人尝试使用转义分析来优化寿命短的对象(可能会将它们放在堆栈上),但我没有看到任何证据表明这会提高性能

与C/C++中的性能影响/好处不同的部分原因是Java在堆上有线程本地分配,并且对象不会被大量回收。C/C++有线程本地堆栈,但您需要额外的库来支持多线程对象分配。对象被更积极地回收,这增加了对象分配的成本


C/C++世界带来的最大变化之一是发现Java的特性要少得多,但它试图充分利用这些特性(JVM中进行了许多复杂的优化)另一方面,Java拥有丰富的开源库。

请跟我重复:Java中堆栈上没有对象分配。

爪哇中,不同于C++,所有对象都被分配到堆上,唯一的出路是垃圾收集时。

在爪哇中,不同于C++,从范围中掉出来的变量并不意味着对象的析构函数运行;事实上,没有析构函数。因此,变量可能不在作用域内,但对象在堆上保持活动状态

我能和“新”一起疯狂吗


对。首先,因为这是实例化对象的唯一方法。其次,因为JVM非常好,它可以在不到一秒钟的时间内创建多达2^32个轻量级对象。

这里真的没有什么可比较的:您不能在Java中的堆栈上创建对象


不过,如果有什么安慰的话,Java中基于堆的分配(至少通常)相当快。Java的垃圾收集器定期“清理”堆,因此它基本上看起来很像堆栈,从堆中进行分配也很像从堆栈中进行分配——在典型情况下,您有一个指向可用内存区域开始(或结束)的指针,分配内存块只意味着添加(或减去)指针的数量,并返回起始地址(然后,当然,在该区域中构造一个或多个对象等)

在Java中,无法手动在堆栈上分配对象,尽管编译器可能会决定在堆栈上分配使用“new”创建的对象,请参阅。

Java没有基于堆栈的对象。我认为你应该小心使用
new
,但是除了性能之外,还有其他原因。独立创建依赖项的类很难进行测试,这通常会导致低质量的代码。出于好奇:在没有新的依赖项的情况下,如何在Java中实例化对象?对精心构造的字节流进行反序列化?克隆原型对象?;-)google
escape analysis java
java有一个finalize()方法,它与析构函数的思想类似,但不能以相同的方式使用。不确定它每秒能创建20亿个对象,因为访问这么多内存需要更长的时间(即硬件限制)