3

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

那么 java 是否可以返回标记为取消分配的对象,或者 java 是否会在每次调用 new constructor() 时创建一个新对象。

我问这个问题的基本意图是,如果发生这种情况,那么可以提高性能,因为创建新内存和销毁未引用对象的成本将降低。

4

6 回答 6

5

是的。

Java 永远不会重用对象。

于 2012-09-25T13:35:19.973 回答
4

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

您的想法很聪明,但实际上会降低性能。JVM 不仅需要跟踪它没有执行的死对象(符合 GC 条件)。但它也必须以某种方式清理旧对象,使其看起来是新鲜的。这很重要,而且会花费很多时间。new更快更简单。

但是有一个问题:

Integer answer = 42;

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

于 2012-09-25T13:37:22.937 回答
2

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

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

对象分配在 Java 中通常被认为是一种廉价的操作——通常你不需要担心它。

在当前版本的 Oracle 的 Java 中实现的复杂优化的一个例子是逃逸分析

于 2012-09-25T13:36:54.763 回答
1

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

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

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

于 2012-09-25T13:43:40.050 回答
1

有一种设计模式叫做flyweight,它的主要优点是重用对象。Java 使用它来创建字符串本身。

你可以在这里了解更多信息:http ://en.wikipedia.org/wiki/Flyweight_pattern

于 2012-09-25T13:50:40.963 回答
0

无论你在哪里看到new(),你都可以确定一个new object is being created..就这么简单..

于 2012-09-25T13:39:55.977 回答