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

JVM 可達(dá)性分析法

1. 前言

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

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

2. 垃圾回收器的位置

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

圖片描述

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

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

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

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

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

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

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

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

那么問(wèn)題又來(lái)了,如何選取 GCRoots 對(duì)象呢?在 Java 語(yǔ)言中,可以作為 GCRoots 的對(duì)象包括下面幾種:

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

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

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

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

圖片描述

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

  • 虛擬機(jī)棧中的引用的對(duì)象:我們?cè)诔绦蛑姓?chuàng)建一個(gè)對(duì)象,對(duì)象會(huì)在堆上開(kāi)辟一塊空間,同時(shí)會(huì)將這塊空間的地址作為引用保存到虛擬機(jī)棧中,如果對(duì)象生命周期結(jié)束了,那么引用就會(huì)從虛擬機(jī)棧中出棧,因此如果在虛擬機(jī)棧中有引用,就說(shuō)明這個(gè)對(duì)象還是有用的,這種情況是最常見(jiàn)的;

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

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

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

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

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

5. 小結(jié)

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

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