成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面試官:JVM 如何確定死亡對象?

開發(fā) 前端
引用計數算法(Reference Counting) 屬于垃圾收集器的早期實現算法了,它指的是在創(chuàng)建對象時關聯(lián)一個與之相對應的計數器,當此對象被使用時加 1,相反銷毀時 -1。當此計數器為 0 時,則表示此對象未使用,可以被垃圾收集器回收。

在 JVM 中,有兩個非常重要的知識點,一個是 JVM 的內存布局(JVM 運行時的數據區(qū)域),另一個就是垃圾回收。而垃圾回收中又有兩個重要的知識點,一個是如何確定 JVM 中的垃圾對象,另一個是使用不同的垃圾收集器進行垃圾回收。而本篇要討論的是前者,后面的內容咱們下一篇再聊。

垃圾(死亡)對象的判定有兩種常用的算法:引用計數器算法和可達性分析算法。

1.引用計數器算法

引用計數算法(Reference Counting) 屬于垃圾收集器的早期實現算法了,它指的是在創(chuàng)建對象時關聯(lián)一個與之相對應的計數器,當此對象被使用時加 1,相反銷毀時 -1。當此計數器為 0 時,則表示此對象未使用,可以被垃圾收集器回收。

引用計數算法的優(yōu)缺點很明顯,其優(yōu)點是垃圾回收比較及時,實時性比較高,只要對象計數器為 0,則可以直接進行回收操作;而缺點是無法解決循環(huán)引用的問題,比如以下代碼:

public class RefCounterTest {
// 對象 A
static class RefObjectA {
private RefObjectB refObjectB;

public void setRefObjectB(RefObjectB refObjectB) {
this.refObjectB = refObjectB;
}
}
// 對象 B
static class RefObjectB {
private RefObjectA refObjectA;

public void setRefObjectA(RefObjectA refObjectA) {
this.refObjectA = refObjectA;
}
}
// 測試代碼
public static void main(String[] args) {
RefObjectA objectA = new RefObjectA();
RefObjectB objectB = new RefObjectB();
objectA.setRefObjectB(objectB);
objectB.setRefObjectA(objectA);
objectA = null;
objectB = null;
}
}

如以上代碼所示,即使是將 main 方法中的 objectA 和 objectB 都設置為 null,也就是這兩個對象都徹底不使用了,但是因為二者存在相互引用的關系,所以它們所對應的對象計數器不為 0,這樣循環(huán)引用導致垃圾數據無法被清除的事件就產生了。

2.可達性分析算法

可達性分析算法(Reachability Analysis) 是目前主流虛擬機中,使用最廣泛的判斷垃圾對象的實現算法,它指的是從對象的起點(GC Roots)開始向下搜索,如果對象到 GC Roots 沒有任何引用鏈相連時,也就是說此對象到 GC Roots 不可達時,則表示此對象可以被垃圾回收器所回收,如下圖所示:

圖片

在 Java 語言中,可作為根節(jié)點(GC Roots)的對象有以下 4 類:

  1. Java 虛擬機棧中的引用對象,也就是 Java 虛擬機棧幀中,本地變量表所存儲的(引用)對象。在 Java 虛擬機棧幀中存儲的對象都是將來執(zhí)行時,要使用的對象,所以和引用對象相關的對象都不能被回收;
  2. 本地方法棧中的引用對象和 Java 虛擬機棧中的引用對象類似,也不能被回收;
  3. 方法區(qū)中類靜態(tài)屬性引用的對象也可以作為 GC Roots;
  4. 方法區(qū)中常量引用的對象也可以作為 GC Roots。因為常量是保存在常量池中的,屬于全局可使用的對象,所以也能作為 GC Roots。

3.有關“引用”

不管是引用計數法還是可達性分析算法都與對象的“引用”有關,這說明對象的引用決定了對象的生死,而 Java 中的引用也比較復雜,它從 JDK 1.2 之后,(引用)分成了以下 4 種類型:

  • 強引用:在代碼中普遍存在的,類似 Object obj = new Object() 這類引用,只要強引用還在,垃圾收集器永遠不會回收掉被引用的對象;
  • 軟引用:是一種相對強引用弱化一些的引用,可以讓對象豁免一些垃圾收集,只有當 JVM 認為內存不足時,才會去試圖回收軟引用指向的對象,JVM 會確保在拋出 OutOfMemoryError 之前,清理軟引用指向的對象;
  • 弱引用:非必需對象,但它的強度比軟引用更弱,被弱引用關聯(lián)的對象只能生存到下一次垃圾收集發(fā)生之前;
  • 虛引用:也稱為幽靈引用或幻影引用,是最弱的一種引用關系,無法通過虛引用來獲取一個對象實例,為對象設置虛引用的目的只有一個,就是當著個對象被收集器回收時收到一條系統(tǒng)通知。

總結

垃圾對象的判定有兩種常用的算法:引用計數器算法和可達性分析算法。其中引用計數器算法實現簡單、運行高效,但是存在循環(huán)引用的問題,所以主流的虛擬機使用的都是可達性分析算法,可達性分析算法是從對象的根節(jié)點 GC Roots 向下搜索,如果根節(jié)點相連就是正常的對象,否則為垃圾對象可以被垃圾回收器回收。

責任編輯:武曉燕 來源: Java面試真題解析
相關推薦

2023-10-08 15:23:12

2021-05-20 08:54:16

Go面向對象

2024-03-07 17:21:12

HotSpotJVMHot Code

2015-08-13 10:29:12

面試面試官

2023-02-16 08:10:40

死鎖線程

2024-02-20 14:10:55

系統(tǒng)緩存冗余

2024-03-18 14:06:00

停機Spring服務器

2010-08-12 16:28:35

面試官

2024-04-03 00:00:00

Redis集群代碼

2024-09-11 22:51:19

線程通訊Object

2021-07-06 07:08:18

管控數據數倉

2025-03-17 00:00:00

2023-11-20 10:09:59

2021-03-16 07:13:07

Java對象存儲

2021-09-28 12:36:02

Linux系統(tǒng)進程

2023-01-26 00:25:09

JVM設置技術

2021-05-18 08:32:33

TCPIP協(xié)議

2024-04-09 10:40:04

2024-01-19 14:03:59

Redis緩存系統(tǒng)Spring

2024-01-26 13:16:00

RabbitMQ延遲隊列docker
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91精品国产一区 | 欧美日本一区 | 欧美人人 | 欧美精品91| 亚洲一区二区三区四区五区中文 | 伊人久久麻豆 | 欧美a在线观看 | 视频一区二区中文字幕日韩 | 我要看黄色录像一级片 | 国产精品二区三区在线观看 | 亚洲一区精品在线 | 欧美在线一区二区三区 | 日韩精品久久久久 | 精品欧美一区二区三区久久久 | 天天干夜夜操 | 九色 在线 | 国产美女h视频 | 草逼网站| 色中文在线 | 91精品国产91久久久久久密臀 | 天天躁日日躁性色aⅴ电影 免费在线观看成年人视频 国产欧美精品 | 国产成人高清视频 | 久久久999成人 | 亚洲精品视频免费观看 | 999精品视频 | 亚洲精品免费在线观看 | 九九九久久国产免费 | 午夜精品久久久久久久99黑人 | 午夜在线视频 | 国产成人在线一区二区 | 久久久高清 | 成人精品一区二区三区中文字幕 | 精品国产一区二区三区久久久蜜月 | 亚洲精彩视频在线观看 | 黄片毛片免费观看 | 亚州毛片 | 91成人免费 | 亚洲97| 91精品国产色综合久久不卡98 | 国产精品区二区三区日本 | 精产嫩模国品一二三区 |