您好,登錄后才能下訂單哦!
本篇內容介紹了“Java垃圾回收的過程是怎樣的”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
Java語言中一個顯著的特點就是引入了垃圾回收機制,這個大家都清楚,垃圾回收的概念這里也不做介紹,重點是垃圾回收是在什么時候開始?對什么東西,做了什么事情?
GC何時開始:
所有的回收器類型都是基于分代技術來實現的,那就必須要清楚對象按其生命周期是如何劃分的。
年輕代:劃分為三個區域:原始區(Eden)和兩個小的存活區(Survivor),兩個存活區按功能分為From和To。絕大多數的對象都在原始區分配,超過一個垃圾回收操作仍然存活的對象放到存活區。垃圾回收絕大部分發生在年輕代。
年老代:存儲年輕代中經過多個回收周期仍然存活的對象,對于一些大的內存分配,也可能直接分配到永久代。
持久代:存儲類、方法以及它們的描述信息,這里基本不產生垃圾回收。
有了以上這些鋪墊之后開始回答GC何時開始:
Eden內存滿了之后,開始Minor GC(從年輕代空間回收內存被稱為 Minor GC);升到老年代的對象所需空間大于老年代剩余空間時開始Full GC(但也可能小于剩余空間時,被HandlePromotionFailure參數強制Full GC)
對什么東西操作,即垃圾回收的對象是什么:
從root開始搜索沒有可達對象,而且經過第一次標記、清理后,仍然沒有復活的對象。
做了什么東西:
主要做了清理對象,整理內存的工作。具體的引申如下
垃圾回收器的類型:
串行垃圾回收器(Serial Garbage Collector)
并行垃圾回收器(Parallel Garbage Collector)
并發標記掃描垃圾回收器(CMS Garbage Collector)
G1垃圾回收器(G1 Garbage Collector)
垃圾回收算法:
引用計數法
標記清除法
復制算法
標記壓縮算法
分代算法
分區算法
以上這些,可以自己了解一下,這里列舉幾篇相關文章:
JVM的內存區域劃分
JVM知識點梳理
JVM內存分配與回收
JVM內存管理機制
Java虛擬機學習 - 垃圾收集器
類在虛擬機中的加載過程
加載Loading:
通過一個類的全限定名來獲取一個二進制字節流、將這個字節流所代表的靜態存儲結構轉化為方法區的運行時數據結構、在內存中生成一個代表這個類的java.lang.Class對象,作為方法區這個類的各種數據的訪問入口。
驗證Verification:
確保Class文件的字節流中包含的信息符合當前虛擬機的要求,并不會危害虛擬機的自身安全。
準備Preparation:
正式為類變量分配內存并設置類變量初始值。
解析Resolution:
虛擬機將常量池內的符號引用替換為直接引用的過程。
初始化Initialization:
類加載過程的最后一步,到了這個階段才真正開始執行類中定義的Java程序代碼。
使用Using:
根據你寫的程序代碼定義的行為執行。
卸載Unloading:
GC負責卸載,這部分一般不用討論。
以上這些拋磚引玉,歡迎留言更清晰的類加載過程,相關文章可以閱讀:
類加載器詳解
詳解java類的生命周期
談談我對面向對象以及類與對象的理解
強引用、軟引用、弱引用、虛引用與GC的關系
強引用:new出的對象之類的引用,只要強引用還在,永遠不會回收。
軟引用:引用但非必須的對象,內存溢出異常之前回收。
弱引用:非必須的對象,對象只能生存到下一次垃圾收集發生之前。
虛引用:對生存時間無影響,在垃圾回收時得到通知。
“Java垃圾回收的過程是怎樣的”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。