在java中,当我们调用new Constructor()
时,每次都会创建一个新对象,即;分配新内存或假设已经为没有任何引用的类创建了许多对象。
因此,java可以返回标记为取消分配的对象,或者每次调用新的构造函数()时java都会创建一个新对象。
我提出这个问题的基本意图是,如果发生这样的事情,那么可以改善性能,因为创建新内存和销毁未经修复的对象的成本将会降低。
答案 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在创建字符串时使用它。
答案 5 :(得分:0)
只要您看到new()
,就可以非常确定new object is being created
..就这么简单..