簡體   English   中英

當我們說垃圾收集器或GC收集對象時,JVM或內存級別會發生什么?

[英]What happens at JVM or memory level when we say object is collected by Garbage Collector or GC?

當我們說對象被GC收集時。 它在后台真正做了什么? 它是否刪除了特定對象占用的所有數據? 或者只是將對象使用的內存區域標記為“可重用”,這樣每當創建新對象時,它們都會被覆蓋在這個內存區域上?

將檢查堆內存以識別正在使用但未使用的對象。 未使用的對象將被刪除。

將回收未引用對象使用的內存。

memoris像垃圾收集器一樣被映射。 在垃圾收集之后,從樹中移除存儲器的鏈接(即樹的節點)。 因此,如果存在與gc根沒有連接的節點,則意味着這些存儲器是免費的。 那些可以被其他用法使用。

實際上很難用單句描述,而不是重新發明輪子,我建議你閱讀以下鏈接,了解gc是如何工作的

http://javabook.compuware.com/content/memory/how-garbage-collection-works.aspx.http://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/geninfo/diagnos/garbage_collect.html

垃圾收集是查看堆內存,識別正在使用哪些對象以及哪些對象未使用的過程,以及刪除未使用的對象。 使用中的對象或引用的對象意味着程序的某些部分仍然維護指向該對象的指針。 程序的任何部分都不再引用未使用的對象或未引用的對象。 因此可以回收未引用對象使用的內存。

從對象分配行為中學習的信息可用於增強JVM的性能。 因此,堆被分解成更小的部分或代。 堆部分是: Young Generation, Old or Tenured Generation,以及Permanent Generation

在此輸入圖像描述

年輕一代是所有新物品被分配和老化的地方。 當年輕一代填滿時,這會導致輕微的垃圾收集。 假設高對象死亡率,可以優化次要集合。 很快就會收集到充滿死亡物體的年輕一代。 一些幸存的物體會老化並最終移動到老一代。

停止世界事件 - 所有小型垃圾收集都是“停止世界”事件。 這意味着在操作完成之前,所有應用程序線程都將停止。 小垃圾收集總是停止世界事件。

舊世代用於存儲長期幸存的物體。 通常,為年輕代對象設置閾值,並且當滿足該年齡時,對象被移動到舊代。 最終需要收集老一代。 此事件稱為主要垃圾回收。

主要垃圾收集也是停止世界事件。 通常,主要集合會慢得多,因為它涉及所有活動對象。 因此,對於響應式應用程序,應盡量減少主要的垃圾收集。 另請注意,主要垃圾收集的Stop the World事件的長度受到用於舊代空間的垃圾收集器類型的影響。

永久生成包含JVM所需的元數據,用於描述應用程序中使用的類和方法。 JVM在運行時根據應用程序使用的類填充永久代。 此外,Java SE庫類和方法可以存儲在此處。

如果JVM發現不再需要它們,則可以收集(卸載)類,並且可能需要其他類的空間。 永久代包含在完整的垃圾收集中。

有關更多說明,請參閱此鏈接垃圾收集器

觸發垃圾收集並且該內存可供使用時,將刪除未引用的對象。

記憶回收並使用它

程序的任何部分都不再引用未使用的對象或未引用的對象。 因此可以回收未引用對象使用的內存。

A pictorial here by oracle

它是否刪除了特定對象占用的所有數據? 或者只是將對象使用的內存區域標記為“可重用”,這樣每當創建新對象時,它們都會被覆蓋在這個內存區域上?

我對此並不完全確定,但我的猜測只是將內存塊標記空閑塊並將其添加到空閑池中以供重用 為什么要通過清理數據來支付這么多費用,而這些數據無論如何都要被其他對象覆蓋。

清潔和再次寫作將花費兩倍的時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM