2012-09-25 63 views
3

在java中,當我們調用new Constructor()時,每次創建一個新對象,即:一個新的內存被分配或者假設已經有許多對象爲一個沒有任何引用的類創建。java是否在每次調用新操作符時創建一個新對象

因此,Java可以返回這樣的對象,它們被標記爲解除分配,或者每次調用一個新的構造函數()時java會創建一個新對象。

我問這個問題的基本意圖是,如果發生這種事情,那麼性能可以提高,因爲創建新內存和銷燬未引用對象的成本將會降低。

回答

5

是的。

Java永遠不會重用一個對象。

+0

此外,一旦對象參考丟失,內存中的對象被佔領的意志* *最終被垃圾收集。 – thatidiotguy

+0

+1當'new'被調用時,'Java將永遠不會再使用一個對象'。對於不是這種情況的字符串文字。 –

+0

@thatidiotguy很好的使用斜體!這最終意味着「讓我在你的議程中給你一個位置,當我覺得它時,我會列舉你所代表的一小部分數據」。您可以向GC發出請求,並且可能(或可能不會)導致GC「快速」。 – Gamb

2

是的,當您在Java中使用new時,總會創建一個新對象。

但是,這並不一定意味着JVM必須要求操作系統分配內存。 JVM如何精確分配內存取決於特定的JVM實現,並且很可能包含大量優化以使其快速高效。

對象分配通常被認爲是Java中的廉價操作 - 通常您不需要擔心它。

在當前版本的Oracle Java中實現的複雜優化的一個示例是escape analysis

4

Java總是創建新的對象。請注意,new運算符在Java中速度非常快。沒有分配,典型的JVM將只增加堆上的一個指針。一旦堆滿了,舊的和不必要的物體就會被移除並且生命被壓縮。但垃圾收集是一個不同的故事。

你的想法很聰明,但實際上會惡化的表現。 JVM不僅需要跟蹤它沒有執行的死對象(符合GC的條件)。但它也必須以某種方式清理舊物體,以便它看起來很新鮮。這是不平凡的,會花費很多時間。 new既快又簡單。

這裏有一個陷阱,但:

Integer answer = 42; 

42是具有轉換爲Integer對象文字。但是JVM不會簡單地調用new Integer(42),而是調用Integer.valueOf(42)。在後一種情況下,valueOf()有時會返回緩存的值值(它將例如針對42)。

0

無論你在哪裏看到new(),你可以相當肯定,一個new object is being created ...就這麼簡單..

1

創建對象和銷燬未引用對象的成本是微不足道的。花費時間的是

  • 檢測何時不再引用對象。要做到這一點,必須檢查每個強有力的參考。
  • 複製從一代保存到另一代的對象並對代進行碎片整理。
  • 最終確定實施finalize()方法的對象。

如果要創建短命的臨時對象的伊甸園大小是否爲8 MB或8 GB,需要做一個小集合的時間幾乎是一樣的。

相關問題