1.運(yùn)行時數(shù)據(jù)區(qū)域JDK 1.6 運(yùn)行時數(shù)據(jù)區(qū)域如下圖:

程序計(jì)數(shù)器:記錄正在執(zhí)行的虛擬機(jī)字節(jié)碼指令的地址(如果正在執(zhí)行的是本地方法則為空)。

Java 虛" />

国产成人精品无码青草_亚洲国产美女精品久久久久∴_欧美人与鲁交大毛片免费_国产果冻豆传媒麻婆精东

15158846557 在線咨詢 在線咨詢
15158846557 在線咨詢
所在位置: 首頁 > 營銷資訊 > 網(wǎng)站運(yùn)營 > 【Java】Java 虛擬機(jī)

【Java】Java 虛擬機(jī)

時間:2023-07-15 02:57:01 | 來源:網(wǎng)站運(yùn)營

時間:2023-07-15 02:57:01 來源:網(wǎng)站運(yùn)營

【Java】Java 虛擬機(jī): 最近做面試題發(fā)現(xiàn) Java 虛擬機(jī)還是考得挺多的。

1.運(yùn)行時數(shù)據(jù)區(qū)域

JDK 1.6 運(yùn)行時數(shù)據(jù)區(qū)域如下圖:

程序計(jì)數(shù)器:記錄正在執(zhí)行的虛擬機(jī)字節(jié)碼指令的地址(如果正在執(zhí)行的是本地方法則為空)。

Java 虛擬機(jī)棧:每個 Java 方法在執(zhí)行的同時會創(chuàng)建一個棧幀,用于存儲局部變量表、操作數(shù)棧、常量池引用等信息。

本地方法棧:與 Java 虛擬機(jī)棧類似,區(qū)別是本地方法棧為本地方法服務(wù)。本地方法一般是用其它語言(C、C++ 或匯編語言等)編寫的。

:所有對象都在這里分配內(nèi)存,是垃圾收集的主要區(qū)域("GC 堆")。

方法區(qū):用于存放已被加載的信息、常量、靜態(tài)變量、即時編譯器編譯后的代碼等數(shù)據(jù)。從 JDK 1.8 開始,移除永久代,并把方法區(qū)移至元空間,它位于本地內(nèi)存中,而不是虛擬機(jī)內(nèi)存中。

運(yùn)行時常量池:方法區(qū)的一部分。Class 文件中的常量池(編譯器生成的字面量和符號引用)會在類加載后被放入這個區(qū)域。

直接內(nèi)存:在 JDK 1.4 中新引入了 NIO 類,它可以使用 Native 函數(shù)庫直接分配堆外內(nèi)存,然后通過 Java 堆里的 DirectByteBuffer 對象作為這塊內(nèi)存的引用進(jìn)行操作。這樣能在一些場景中顯著提高性能,因?yàn)楸苊饬嗽诙褍?nèi)存和堆外內(nèi)存來回拷貝數(shù)據(jù)。

2.垃圾收集

垃圾收集主要是針對堆和方法區(qū)進(jìn)行。

如何判斷對象是否可以回收:

  1. 引用計(jì)數(shù)法:引用計(jì)數(shù)為 0 的對象可被回收。Java 虛擬機(jī)不使用引用計(jì)數(shù)算法。
  2. 可達(dá)性分析算法:以 GC Roots 為起始點(diǎn)進(jìn)行搜索,可達(dá)的對象都是存活的,不可達(dá)的對象可被回收。
  3. 方法區(qū)的回收:方法區(qū)主要存放永久代對象,主要是對常量池的回收和對類的卸載。
  4. finalize()
垃圾收集算法

  1. 標(biāo)記-清除:標(biāo)記:活動對象會在對象頭部打上標(biāo)記。清除:進(jìn)行對象回收并取消標(biāo)志位。
  2. 標(biāo)記-整理:讓所有存活的對象都向一端移動,然后直接清理掉端邊界以外的內(nèi)存。
  3. 復(fù)制:將內(nèi)存劃分為大小相等的兩塊,每次只使用其中一塊,當(dāng)這一塊內(nèi)存用完了就將還存活的對象復(fù)制到另一塊上面,然后再把使用過的內(nèi)存空間進(jìn)行一次清理?,F(xiàn)在的商業(yè)虛擬機(jī)都采用這種收集算法回收新生代,但是并不是劃分為大小相等的兩塊,而是一塊較大的 Eden 空間和兩塊較小的 Survivor 空間,每次使用 Eden 和其中一塊 Survivor。在回收時,將 Eden 和 Survivor 中還存活著的對象全部復(fù)制到另一塊 Survivor 上,最后清理 Eden 和使用過的那一塊 Survivor。
  4. 分代收集:根據(jù)對象存活周期將內(nèi)存劃分為幾塊,不同塊采用適當(dāng)?shù)氖占惴āR话銓⒍逊譃樾律屠夏甏?。新生代使用:?fù)制算法。老年代使用:標(biāo)記 - 清除 或者 標(biāo)記 - 整理 算法
CMS 收集器和 G1 收集器比較

CMS(Concurrent Mark Sweep),Mark Sweep 指的是標(biāo)記 - 清除算法。

分為以下四個流程:

在整個過程中耗時最長的并發(fā)標(biāo)記和并發(fā)清除過程中,收集器線程都可以與用戶線程一起工作,不需要進(jìn)行停頓。

具有以下缺點(diǎn):

G1(Garbage-First),它是一款面向服務(wù)端應(yīng)用的垃圾收集器,在多 CPU 和大內(nèi)存的場景下有很好的性能。HotSpot 開發(fā)團(tuán)隊(duì)賦予它的使命是未來可以替換掉 CMS 收集器。

堆被分為新生代和老年代,其它收集器進(jìn)行收集的范圍都是整個新生代或者老年代,而 G1 可以直接對新生代和老年代一起回收。

G1 把堆劃分成多個大小相等的獨(dú)立區(qū)域(Region),新生代和老年代不再物理隔離。

通過引入 Region 的概念,從而將原來的一整塊內(nèi)存空間劃分成多個的小空間,使得每個小空間可以單獨(dú)進(jìn)行垃圾回收。這種劃分方法帶來了很大的靈活性,使得可預(yù)測的停頓時間模型成為可能。通過記錄每個 Region 垃圾回收時間以及回收所獲得的空間(這兩個值是通過過去回收的經(jīng)驗(yàn)獲得),并維護(hù)一個優(yōu)先列表,每次根據(jù)允許的收集時間,優(yōu)先回收價值最大的 Region。

每個 Region 都有一個 Remembered Set,用來記錄該 Region 對象的引用對象所在的 Region。通過使用 Remembered Set,在做可達(dá)性分析的時候就可以避免全堆掃描。

如果不計(jì)算維護(hù) Remembered Set 的操作,G1 收集器的運(yùn)作大致可劃分為以下幾個步驟:

具備如下特點(diǎn):

3.內(nèi)存分配與回收

3.1 內(nèi)存分配策略

  1. 對象優(yōu)先在 Eden 分配,當(dāng) Eden 空間不夠時,發(fā)起 Minor GC。
  2. 大對象直接進(jìn)入老年代,最典型的大對象是那種很長的字符串以及數(shù)組。
  3. 長期存活的對象進(jìn)入老年代。
  4. 動態(tài)對象年齡判定:如果在 Survivor 中相同年齡所有對象大小的總和大于 Survivor 空間的一半,則年齡大于或等于該年齡的對象可以直接進(jìn)入老年代,無需等到 MaxTenuringThreshold 中要求的年齡。
  5. 空間分配擔(dān)保:在發(fā)生 Minor GC 之前,虛擬機(jī)先檢查老年代最大可用的連續(xù)空間是否大于新生代所有對象總空間,如果條件成立的話,那么 Minor GC 可以確認(rèn)是安全的。如果不成立的話虛擬機(jī)會查看 HandlePromotionFailure 的值是否允許擔(dān)保失敗,如果允許那么就會繼續(xù)檢查老年代最大可用的連續(xù)空間是否大于歷次晉升到老年代對象的平均大小,如果大于,將嘗試著進(jìn)行一次 Minor GC;如果小于,或者 HandlePromotionFailure 的值不允許冒險,那么就要進(jìn)行一次 Full GC。

3.2 內(nèi)存回收

Minor GC:回收新生代,因?yàn)樾律鷮ο蟠婊顣r間很短,因此 Minor GC 會頻繁執(zhí)行,執(zhí)行的速度一般也會比較快。

Full GC:回收老年代和新生代,老年代對象其存活時間長,因此 Full GC 很少執(zhí)行,執(zhí)行速度會比 Minor GC 慢很多。觸發(fā)條件:

4.類加載

包括以下 7 個階段:

4.1 類加載器分類

從 Java 虛擬機(jī)的角度來講,只存在以下兩種不同的類加載器:

從 Java 開發(fā)人員的角度看,類加載器可以劃分得更細(xì)致一些:

4.2 雙親委派模型

  1. 工作過程:一個類加載器首先將類加載請求轉(zhuǎn)發(fā)到父類加載器,只有當(dāng)父類加載器無法完成時才嘗試自己加載。
  2. 好處:使得 Java 類隨著它的類加載器一起具有一種帶有優(yōu)先級的層次關(guān)系,從而使得基礎(chǔ)類得到統(tǒng)一。例如 java.lang.Object 存放在 rt.jar 中,如果編寫另外一個 java.lang.Object 并放到 ClassPath 中,程序可以編譯通過。由于雙親委派模型的存在,所以在 rt.jar 中的 Object 比在 ClassPath 中的 Object 優(yōu)先級更高,這是因?yàn)?rt.jar 中的 Object 使用的是啟動類加載器,而 ClassPath 中的 Object 使用的是應(yīng)用程序類加載器。rt.jar 中的 Object 優(yōu)先級更高,那么程序中所有的 Object 都是這個 Object。

關(guān)鍵詞:虛擬

74
73
25
news

版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。

為了最佳展示效果,本站不支持IE9及以下版本的瀏覽器,建議您使用谷歌Chrome瀏覽器。 點(diǎn)擊下載Chrome瀏覽器
關(guān)閉