第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

JVM 可達(dá)性分析法

1. 前言

上節(jié)課我們結(jié)束了運(yùn)行時(shí)數(shù)據(jù)區(qū)的講解,本節(jié)課程開始,我們來對執(zhí)行引擎進(jìn)行講解,在執(zhí)行引擎模塊中,首當(dāng)其沖的就是垃圾回收器。本節(jié)主要知識點(diǎn)如下:

  • 了解垃圾回收器在 JVM 整體架構(gòu)中的位置,為本節(jié)基礎(chǔ)知識;
  • 了解并掌握垃圾回收器的定義以及意義,為本節(jié)基礎(chǔ)知識;
  • 理解并掌握可達(dá)性分析法的原理以及意義,為本節(jié)課程的核心知識點(diǎn)。

2. 垃圾回收器的位置

我們在 JVM 整體架構(gòu)介紹的小節(jié)提到過 JVM 的垃圾回收器位于執(zhí)行引擎中。而當(dāng)時(shí)我們的執(zhí)行引擎只是簡單的畫了下,那么我們先來看下執(zhí)行引擎的更細(xì)致的結(jié)構(gòu)如下圖:

圖片描述

Tips:在講解可達(dá)性分析之前,我們先來解決一些基本問題:什么是垃圾回收器?為什么進(jìn)行垃圾回收?哪些內(nèi)存需要回收?

3. 垃圾回收器的基本概念

什么是垃圾回收器:JVM 為 Java 提供了垃圾回收機(jī)制,其實(shí)是一種偏自動的內(nèi)存管理機(jī)制。簡單來說,垃圾回收器會自動追蹤所有正在使用的對象,并將其余未被使用的對象標(biāo)記為垃圾,不需要開發(fā)者手動進(jìn)行垃圾回收,JVM 自動進(jìn)行垃圾回收,釋放內(nèi)容。

為什么進(jìn)行垃圾回收:如果不進(jìn)行垃圾回收,內(nèi)存遲早都會被消耗空,因?yàn)槲覀冊诓粩嗟姆峙鋬?nèi)存空間而不進(jìn)行回收。除非內(nèi)存無限大,我們可以任性的分配不回收,但是事實(shí)并非如此。所以,垃圾回收是必須的。

哪些內(nèi)存需要回收:哪些內(nèi)存需要回收是垃圾回收機(jī)制第一個要考慮的問題,所謂“要回收的垃圾”無非就是那些不可能再被任何途徑所使用的對象。無需再使用的對象,會被標(biāo)記為垃圾,等待JVM回收此部分內(nèi)存。

Tips:Java中通過可達(dá)性分析法來檢測對象是否為垃圾,如果不可達(dá),則將對象標(biāo)記為垃圾,會被 JVM 回收,接下來我們學(xué)習(xí)可達(dá)性分析法。

4. 可達(dá)性分析法基本原理

方法原理:通過一系列稱為"GC Roots"的對象作為起始點(diǎn),從這些節(jié)點(diǎn)向下搜索,搜索所走過的路徑稱為引用鏈(即GC Roots到對象不可達(dá)時(shí)),則證明此對象是不可用的。

那么問題又來了,如何選取 GCRoots 對象呢?在 Java 語言中,可以作為 GCRoots 的對象包括下面幾種:

  • 虛擬機(jī)棧(棧幀中的局部變量區(qū),也叫局部變量表)中引用的對象;
  • 方法區(qū)中的類靜態(tài)變量屬性引用的對象;
  • 方法區(qū)中常量引用的對象;
  • 本地方法棧中 JNI(Native方法)引用的對象。

Tips:看了如上的原理與 GC Roots 選擇的描述,感覺概念性問題比較抽象,難于理解,我們繼續(xù)通過示例來進(jìn)一步理解可達(dá)性分析法。

4. 可達(dá)性分析法示例

上文中提到了,可達(dá)性分析法是通過 GC Roots 為起點(diǎn)的搜索,有四種對象可以作為 GC Roots,那么我們通過如下示意圖來理解下,何為不可達(dá)對象。

圖片描述

GC Roots 四種類型解釋:從上圖中,我們可以看到四種 GC Roots。這里我們對這四種 GC Roots 做一下更為細(xì)致的解釋。

  • 虛擬機(jī)棧中的引用的對象:我們在程序中正常創(chuàng)建一個對象,對象會在堆上開辟一塊空間,同時(shí)會將這塊空間的地址作為引用保存到虛擬機(jī)棧中,如果對象生命周期結(jié)束了,那么引用就會從虛擬機(jī)棧中出棧,因此如果在虛擬機(jī)棧中有引用,就說明這個對象還是有用的,這種情況是最常見的;

  • 全局的靜態(tài)的對象:也就是使用了 static 關(guān)鍵字,由于虛擬機(jī)棧是線程私有的,所以這種對象的引用會保存在共有的方法區(qū)中,顯然將方法區(qū)中的靜態(tài)引用作為 GC Roots 是必須的;

  • 常量引用:就是使用了 static final 關(guān)鍵字,由于這種引用初始化之后不會修改,所以方法區(qū)常量池里的引用的對象也應(yīng)該作為 GC Roots;

  • Native 方法引用對象:這一種是在使用 JNI 技術(shù)時(shí),有時(shí)候單純的 Java 代碼并不能滿足我們的需求,我們可能需要在 Java 中調(diào)用 C 或 C++ 的代碼,因此會使用 native 方法,JVM 內(nèi)存中專門有一塊本地方法棧,用來保存這些對象的引用,所以本地方法棧中引用的對象也會被作為 GC Roots。

從上圖來理解可達(dá)性分析法就會非常簡單,四種 GC Roots 無非是 Java 中的引用對象,從GC Roots 出發(fā),類似于我們使用開發(fā)工具看代碼,發(fā)現(xiàn)某部分代碼用不到了,我們就會刪除這部分代碼。其實(shí)可達(dá)性分析法也是如此,發(fā)現(xiàn)某些對象不可達(dá)了,就會被垃圾回收器收集。

從上圖中來看,對象 A,B,C,D,E,F(xiàn) 為可達(dá)對象;而對象 G,H,I,J,K 為不可達(dá)對象,會被標(biāo)記為垃圾對象,最終被垃圾回收器回收。

5. 小結(jié)

本節(jié)講解了垃圾回收回收器的定義以及垃圾回收器存在的意義,并在此基礎(chǔ)上講解了垃圾回收器是如何判定對象的可達(dá)性的??蛇_(dá)性分析法是本節(jié)的核心知識點(diǎn),是必須要掌握的知識點(diǎn)。

在講解 GC Roots 的知識點(diǎn)時(shí),我們總是會使用 “引用對象” 這四個字,其中引用又分為 4 種引用,下節(jié)課程我們會詳細(xì)的講解。