摘要:什么是自動垃圾回收自動垃圾回收是一種在堆內存中找出哪些對象在被使用,還有哪些對象沒被使用,并且將后者刪掉的機制。本文接下來將介紹垃圾回收機制的基本過程。事件小型垃圾回收屬于一種叫的事件。還要注意,的的時長受年老代垃圾回收器類型的影響。
什么是自動垃圾回收?
自動垃圾回收是一種在堆內存中找出哪些對象在被使用,還有哪些對象沒被使用,并且將后者刪掉的機制。
所謂使用中的對象(已引用對象),指的是程序中有指針指向的對象;而未使用中的對象(未引用對象),則沒有被任何指針給指向,因此占用的內存也可以被回收掉。
在用 C 之類的編程語言時,程序員需要自己手動分配和釋放內存。而 Java 不一樣,它有垃圾回收器,釋放內存由回收器負責。本文接下來將介紹垃圾回收機制的基本過程。
第一步:標記
垃圾回收的第一步是標記。垃圾回收器此時會找出哪些內存在使用中,還有哪些不是。
上圖中,藍色表示已引用對象,橙色表示未引用對象。垃圾回收器要檢查完所有的對象,才能知道哪些有被引用,哪些沒。如果系統里所有的對象都要檢查,那這一步可能會相當耗時間。
第二步:清除
這一步會刪掉標記出的未引用對象。
內存分配器會保留指向可用內存的引用,以供分配新對象。
壓縮
為了提升性能,刪除了未引用對象后,還可以將剩下的已引用對象放在一起(壓縮),這樣就能更簡單快捷地分配新對象了。
JVM 分代
根據之前的規律,就可以用來提升 JVM 的效率了。方法是,把堆分成幾個部分(就是所謂的分代),分別是新生代、老年代,以及永生代。
新對象會被分配在新生代內存。一旦新生代內存滿了,就會開始對死掉的對象,進行所謂的小型垃圾回收過程。一片新生代內存里,死掉的越多,回收過程就越快;至于那些還活著的對象,此時就會老化,并最終老到進入老年代內存。
Stop the World 事件 —— 小型垃圾回收屬于一種叫 "Stop the World" 的事件。在這種事件發生時,所有的程序線程都要暫停,直到事件完成(比如這里就是完成了所有回收工作)為止。
老年代用來保存長時間存活的對象。通常,設置一個閾值,當達到該年齡時,年輕代對象會被移動到老年代。最終老年代也會被回收。這個事件成為 Major GC。
Major GC 也會觸發STW(Stop the World)。通常,Major GC會慢很多,因為它涉及到所有存活對象。所以,對于響應性的應用程序,應該盡量避免Major GC。還要注意,Major GC的STW的時長受年老代垃圾回收器類型的影響。
永久代包含JVM用于描述應用程序中類和方法的元數據。永久代是由JVM在運行時根據應用程序使用的類來填充的。此外,Java SE類庫和方法也存儲在這里。
如果JVM發現某些類不再需要,并且其他類可能需要空間,則這些類可能會被回收。
世代垃圾收集過程
首先,將任何新對象分配給 eden 空間。 兩個 survivor 空間都是空的。
當 eden 空間填滿時,會觸發輕微的垃圾收集。
引用的對象被移動到第一個 survivor 空間。 清除 eden 空間時,將刪除未引用的對象。
在下一次Minor GC中,Eden區也會做同樣的操作。刪除未被引用的對象,并將被引用的對象移動到Survivor區。然而,這里,他們被移動到了第二個Survivor區(S1)。
此外,第一個Survivor區(S0)中,在上一次Minor GC幸存的對象,會增加年齡,并被移動到S1中。待所有幸存對象都被移動到S1后,S0和Eden區都會被清空。注意,Survivor區中有了不同年齡的對象。
在下一次Minor GC中,會重復同樣的操作。不過,這一次Survivor區會交換。被引用的對象移動到S0,。幸存的對象增加年齡。Eden區和S1被清空。
在較小的GC之后,當老化的物體達到一定的年齡閾值(在該示例中為8)時,它們從年輕一代晉升到老一代。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/75065.html
摘要:一次性編譯成機器碼,脫離開發環境獨立運行,運行效率較高。解釋型語言使用專門的解釋器對源程序逐行解釋成特定平臺的機器碼并立即執行的語言。垃圾回收機制保護程序的完整性,垃圾回收是語言安全性策略的一個重要部分。 Java程序運行機制 編譯型語言 使用專門的編譯器,針對特定平臺(操作系統)將某種高級語言源代碼一次性翻譯成可被該平臺硬件執行的機器碼(包括機器指令和操作數),并包裝成該平臺所能識...
摘要:并發標記清除垃圾回收器,使用多個線程來掃描堆內存并標記可被清除的對象,然后清除標記的對象。垃圾回收器應用于大的堆內存空間。它將堆內存空間劃分為不同的區域,對各個區域并行地做回收工作。它會通過把重復的值移動到同一個數組來優化堆內存占用。 本文非原創,翻譯自Types of Java Garbage Collectors在Java中為對象分配和釋放內存空間都是由垃圾回收線程自動執行完成的。...
摘要:當一個實例被創建的時候,它最初被存放在堆內存空間的年輕代的區中。老年代或者永久代是堆內存的第二個邏輯部分。在垃圾回收過程中掃描屬于部分的堆內存。一旦實例從堆內存中刪除了,它們原來的位置將空出來給以后分配實例使用。 本文非原創,翻譯自How Java Garbage Collection Works?在Java中為對象分配和釋放內存空間都是由垃圾回收線程自動執行完成的。和C語言不一樣的是...
摘要:當一個對象被一個或一個以上的引用變量所引用時,它處于可達狀態,不可能被系統垃圾回收機制回收。虛引用主要用于跟蹤對象被垃圾回收的狀態,虛引用不能單獨使用,虛引用必須和引用隊列聯合使用。 當程序創建對象、數組等引用類型實體時,系統都會在堆內存中為之分配一塊內存區,對象就保存在這塊內存區中,當這塊內存不再被任何引用變量引用時,這塊內存就變成垃圾,等待垃圾回收機制進行回收。垃圾回收機制具有如下...
摘要:在架構中,堆內存和垃圾回收器這兩個部分和垃圾回收相關。堆內存在的內存模型中,最重要的是要了解堆內存的概念。在垃圾回收的過程中,這些對象將被從堆內存中清除,同時它們的空間也就被回收了。 本文非原創,翻譯自Java Garbage Collection introduction在Java中為對象分配和釋放內存空間都是由垃圾回收線程自動執行完成的。和C語言不一樣的是Java程序員不需要手動寫...
摘要:年輕代的目標就是盡可能快速的收集掉那些生命周期短的對象。年老代在年輕代中經歷了次垃圾回收后仍然存活的對象,就會被放到年老代中。什么情況下觸發垃圾回收由于對象進行了分代處理,因此垃圾回收區域時間也不一樣。 [TOC] 與C/C++相比,java語言不需要程序員直接控制內存回收,java程序的內存分配和回收都是由JRE在后臺自動進行,JRE會負責回收那些不再使用的內存,這種機制被稱為垃圾...
閱讀 3793·2021-09-29 09:34
閱讀 3770·2021-09-27 13:34
閱讀 565·2021-09-24 09:47
閱讀 3036·2019-08-30 15:53
閱讀 1808·2019-08-26 13:54
閱讀 2085·2019-08-26 13:43
閱讀 531·2019-08-23 14:47
閱讀 1739·2019-08-23 14:28