每次调用new运算符时,java都会创建一个新对象

时间:2012-09-25 13:34:17

标签: java

在java中,当我们调用new Constructor()时,每次都会创建一个新对象,即;分配新内存或假设已经为没有任何引用的类创建了许多对象。

因此,java可以返回标记为取消分配的对象,或者每次调用新的构造函数()时java都会创建一个新对象。

我提出这个问题的基本意图是,如果发生这样的事情,那么可以改善性能,因为创建新内存和销毁未经修复的对象的成本将会降低。

6 个答案:

答案 0 :(得分:5)

Java永远不会重用对象。

答案 1 :(得分:4)

Java始终创建新对象。请注意,new运算符在Java中非常快。没有分配,典型的JVM只会在堆上增加一个指针。堆已满后,将删除旧的和不必要的对象并压缩实时。但垃圾收集是另一回事。

你的想法很聪明,但实际上会恶化表现。 JVM不仅要跟踪它没有做的死对象(符合GC条件)。但它也必须以某种方式清理旧物体,以使它看起来很新鲜。这是非平凡的,需要花费很多时间。 new既快又简单。

但有一个问题:

Integer answer = 42;

42是必须转换为Integer对象的文字。但是,JVM不会简单地调用new Integer(42)而是调用Integer.valueOf(42)。在后一种情况下,valueOf()有时会返回缓存的值(例如,42)。

答案 2 :(得分:2)

是的,当您在Java中使用new时,始终会创建一个新对象。

但是,这并不一定意味着JVM必须要求操作系统分配内存。 JVM如何精确分配内存取决于特定的JVM实现,并且很可能包含大量优化以使其快速有效。

对象分配通常被认为是Java中的廉价操作 - 通常您不必担心它。

在当前版本的Oracle Java中实现的复杂优化的一个示例是escape analysis

答案 3 :(得分:1)

创建对象和销毁未引用对象的成本是微不足道的。花费时间的是

  • 检测何时不再引用对象。为此,必须检查每个强引用。
  • 复制从一代到另一代的对象,并对一代人进行碎片整理。
  • 完成实现finalize()方法的对象。

如果您创建短暂的临时对象,无论您的Eden大小是8 MB还是8 GB,那么进行次要收集所需的时间几乎相同。

答案 4 :(得分:1)

有一种名为flyweight的设计模式,它的主要优点是重用对象。 Java在创建字符串时使用它。

您可以在此处了解详情:http://en.wikipedia.org/wiki/Flyweight_pattern

答案 5 :(得分:0)

只要您看到new(),就可以非常确定new object is being created ..就这么简单..