java是否在每次调用new操作符时都创建一个新对象

java是否在每次调用new操作符时都创建一个新对象,java,Java,在java中,当我们调用新构造函数()时,每次都会创建一个新对象,即;分配了一个新内存,或者假设已经为一个没有任何引用的类创建了许多对象 因此,java可以返回标记为取消分配的对象,也可以在每次调用新构造函数()时创建新对象 我问这个问题的基本意图是,如果发生这种情况,那么性能可以得到提高,因为创建新内存和销毁未引用对象的成本将降低。是的 Java永远不会重复使用对象。是的,在Java中使用new时,始终会创建一个新对象 然而,这并不一定意味着JVM必须要求操作系统分配内存。JVM如何准确地分配

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

因此,java可以返回标记为取消分配的对象,也可以在每次调用新构造函数()时创建新对象

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

是的


Java永远不会重复使用对象。

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

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

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


Oracle Java当前版本中实现的复杂优化的一个例子是。

Java总是创建新对象。请注意,
new
操作符在Java中速度非常快。并没有分配,典型的JVM只会在堆上增加一个指针。堆满后,旧的和不必要的对象将被删除,活动对象将被压缩。但垃圾收集是另一回事

您的想法很聪明,但实际上会使性能恶化。JVM不仅必须跟踪它没有做的死对象(符合GC条件)。但它也必须以某种方式清理旧物体,使其看起来是新鲜的。这不是小事,需要很多时间<代码>新建既快又简单

不过,有一个问题:

Integer answer = 42;

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

无论您在哪里看到
new()
,都可以非常确定正在创建一个
新对象。。就这么简单。

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

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

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

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


您可以在这里了解更多信息:

此外,一旦对对象的引用丢失,对象占用的内存最终将被垃圾回收。+1
Java在调用
new
时将永远不会重复使用对象。对于不是这种情况的字符串文本。@ThatidotGuy很好地使用了斜体!这最终意味着“让我在我的议程中给你一个位置,当我想的时候,我会接收你代表的微小数据”。您可以向GC发出请求,这可能(也可能不会)导致GC“加速”。