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

JVM是如何和“垃圾”發生關系的

云計算 虛擬化
在對象池中對象的引用層次,有的是很深的。比如一個調用非常頻繁的接口,生產對象的速度是非??捎^的。對象之間的關系,可以形容成一張網。雖然Java總是給人一種有使不完的內存的感覺,但是對象也不能一直增加不減少啊,所以就必須有垃圾回收這個操作。

[[408351]]

本文轉載自微信公眾號「碼上Java」,作者碼上Java。轉載本文請聯系碼上Java公眾號。

在開始之前,我們先回顧一下堆是個什么玩意,大家可能都知道,我們每天創建的Java對象幾乎都存放在堆上面,所以說堆是一個巨大的對象池一點都不過分,在這個對象池里面管理者數據巨大的對象實例。

在對象池中對象的引用層次,有的是很深的。比如一個調用非常頻繁的接口,生產對象的速度是非常可觀的。對象之間的關系,可以形容成一張網。雖然Java總是給人一種有使不完的內存的感覺,但是對象也不能一直增加不減少啊,所以就必須有垃圾回收這個操作。

那么JVM如何發現垃圾的呢?

"垃圾回收"本文中簡稱 GC

你還記得電視劇中的“誅九族""?

比如小憨批打了皇帝老兒一巴掌,把皇帝老兒打的鼻青臉腫滴,皇帝老兒非常生氣,他要下令誅小憨批的九族,以平心頭只恨。

哈哈哈嗝~ 小憨批完了~

那么我們看看在古代這個誅九族是具體操作的呢?首先需要追溯到共同的祖先(也就是小憨批家族的大哥大),再往下逐一細數和小憨批有關系的(小憨批真坑啊)。

其實發生在堆上的垃圾回收和這個“誅九族“的是相同思路,那么我們下面具體分析一下JVM是如何進行GC的呢?

關于JVM的GC是不受程序控制的,當滿足一定條件的時候就會主動觸發。

當發生GC的時候,對于一個對象來說,JVM總能夠找到引用它的祖先,當找到最后的時候,JVM發現這家伙的有些祖先已經玩完了,那么它們就會被JVM給干掉。

為什么還有沒有被干掉的祖先呢?因為這些躲過GC的祖先們,它們是GC Roots ,長得比較特殊嘛(下面介紹它們的樣子)。

當從GC Roots 向下追溯、搜索,就會產生一個引用鏈。當碰到有對象沒有任何一個GC Roots 產生關系的話,這個對象就會被無情的干掉。(一根繩上的螞蚱嘛)

來,我們畫個圖瞅瞅咋回事,如下圖所示,Object5、Object6、Object7,由于不能和 GC Root 產生關聯,發生 GC 時,就會被摧毀。

其實所謂的垃圾回收就是圍繞著GC Roots 來的,但是同時,GC Roots 也存在著很多內存泄漏的根源,因為其他引用小弟壓根沒有這個權利。

你可能會產生疑問,那么什么樣的對象才會是GC Roots 呢?

這個不在于它是什么樣的對象,關鍵是它所處的位置(仔細品~)。

GC Roots 是什么

首先,GC Roots必須是一組必須活躍的引用。簡單的講,就是程序接下來通過直接引用或間接引用,能夠被訪問到的潛在被使用的對象(咋感覺還是有點繞呢)。

GC Roots 是這樣子滴:

  1. Java線程中,當前所有正在被調用的方法的引用類型參數、局部變量、臨時值等等。也就是與我們棧幀相關的各種引用。
  2. 所有當前被加載的Java類。
  3. Java類的引用類型靜態變量。
  4. 運行時常量池里的引用類型常量。
  5. JVM內部數據結構的一些引用,比如sun.jvm.hotspot.memory.Univers類。
  6. 用于同步的監控對象。比如調用了對象的wait()方法。
  7. JNI handles,包括global handles 和 local handles。

以上GC Roots大致可以分為一下三大類。

  1. 活動線程相關的各種引用。
  2. 類的靜態變量的引用。
  3. JNI引用。

最后我們需要注意的是,我們這里說的是活躍的引用,而不是對象,對象是不能作為GC Roots的。

整個GC過程中是找到那些活對象,并把剩余的空間都認得為“無用”。而不是找到所有死掉的對象,并回收它們占用的空間。所有說,哪怕JVM的堆非常大,基于tracing的GC方式,回收速度也是跟快的。

總結

GC Roots 就是可達性分析法。還有一種叫作引用計數法的方式。下面我們簡單介紹一下。

引用計數法:在Java中如果要操作對象,就必須先獲取該對象的引用,因此可以通過引用計數法來判斷一個對象是否可以被回收。在為一個對象添加一個引用時,引用計數器就加1;為對象刪除一個引用時,引用計數器就減1;如果一個對象的引用計數為0,則說明該對象沒有被引用,可以回收。

優點是垃圾回收比較及時,實時性比較高,只要對象計數器為 0,則可以直接進行回收操作;而缺點是無法解決循環引用的問題。

因為存在循環引用這個致命的硬傷,沒有一個主流JVM是采用引用計數法來實現 GC 的,所以你現在完全忘記引用計數這種方式了。

 

責任編輯:武曉燕 來源: 碼上Java
相關推薦

2017-07-25 16:06:32

白熊視頻程序員人工智能

2022-03-21 11:33:11

JVM垃圾回收器垃圾回收算法

2022-01-20 10:34:49

JVM垃圾回收算法

2010-09-26 16:42:04

JVM內存組成JVM垃圾回收

2023-10-07 08:41:42

JavaJVM

2021-11-05 15:23:20

JVM回收算法

2021-03-24 10:40:26

Python垃圾語言

2022-06-22 09:54:45

JVM垃圾回收Java

2009-12-30 10:14:29

JVM垃圾回收

2009-09-24 18:29:12

2009-12-25 16:15:31

JVM垃圾回收算法

2010-09-26 11:22:22

JVM垃圾回收JVM

2023-08-08 10:29:55

JVM優化垃圾回收

2017-08-04 10:53:30

回收算法JVM垃圾回收器

2010-09-27 09:01:26

JVM分代垃圾回收

2010-09-27 13:33:26

JVM異常

2024-03-11 16:27:02

垃圾回收器JVM

2020-11-18 10:54:29

垃圾回收器演進

2010-09-27 12:42:15

JVM1.4.1JVM垃圾收集

2010-09-25 15:33:19

JVM垃圾回收
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国内精品在线视频 | 综合久久久| 欧美成人综合 | 天堂久久天堂综合色 | 在线观看中文字幕 | 国内自拍视频在线观看 | 狠狠天天 | www.精品国产| 亚洲国产激情 | 久久网国产 | av在线免费观看网站 | 欧美成人在线网站 | 最新日韩在线视频 | 久久精品免费 | 国产有码| 亚洲第一成人影院 | 91亚洲一区 | 一级片在线免费看 | 亚洲综合色网 | 亚洲视频在线免费观看 | 亚洲av毛片成人精品 | 色性av| 亚洲一区二区国产 | 黄色大片免费网站 | 国产视频福利一区 | 欧美亚州综合 | 欧美4p | 日韩精品一区二区三区高清免费 | 欧美成人高清 | 亚洲午夜精品久久久久久app | 91日韩| 中文字幕一区在线 | 国产综合视频 | av网站在线看 | 人干人操| 亚洲国产精品一区二区久久 | 亚洲国产精品久久久 | 在线成人免费视频 | 亚洲一区二区精品 | 国产一区二区三区四区三区四 | 另类二区 |