91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java——JVM篇——收藏系列來啦(二)

發布時間:2020-07-12 15:02:55 來源:網絡 閱讀:112 作者:颯拉阿依醬 欄目:編程語言

2.4.垃圾回收與算法
Java——JVM篇——收藏系列來啦(二)
2.4.1. 如何確定垃圾
2.4.1.1.引用計數法
在 Java 中,引用和對象是有關聯的。如果要操作對象則必須用引用進行。因此,很顯然一個簡單的辦法是通過引用計數來判斷一個對象是否可以回收。簡單說,即一個對象如果沒有任何與之關聯的引用,即他們的引用計數都不為 0,則說明對象不太可能再被用到,那么這個對象就是可回收對象。

2.4.1.2.可達性分析
為了解決引用計數法的循環引用問題,Java 使用了可達性分析的方法。通過一系列的“GC roots”對象作為起點搜索。如果在“GC roots”和一個對象之間沒有可達路徑,則稱該對象是不可達的。
要注意的是,不可達對象不等價于可回收對象,不可達對象變為可回收對象至少要經過兩次標記過程。兩次標記后仍然是可回收對象,則將面臨回收。

2.4.2. 標記清除算法(Mark-Sweep)
最基礎的垃圾回收算法,分為兩個階段,標注和清除。標記階段標記出所有需要回收的對象,清除階段回收被標記的對象所占用的空間。如圖

Java——JVM篇——收藏系列來啦(二)
從圖中我們就可以發現,該算法最大的問題是內存碎片化嚴重,后續可能發生大對象不能找到可利用空間的問題。

2.4.3. 復制算法(copying)
為了解決 Mark-Sweep 算法內存碎片化的缺陷而被提出的算法。按內存容量將內存劃分為等大小的兩塊。每次只使用其中一塊,當這一塊內存滿后將尚存活的對象復制到另一塊上去,把已使用的內存清掉,如圖

Java——JVM篇——收藏系列來啦(二)
這種算法雖然實現簡單,內存效率高,不易產生碎片,但是最大的問題是可用內存被壓縮到了原本的一半。且存活對象增多的話,Copying 算法的效率會大大降低。

2.4.4. 標記整理算法(Mark-Compact)
結合了以上兩個算法,為了避免缺陷而提出。標記階段和 Mark-Sweep 算法相同,標記后不是清理對象,而是將存活對象移向內存的一端。然后清除端邊界外的對象。如圖:

Java——JVM篇——收藏系列來啦(二)
2.4.5. 分代收集算法
分代收集法是目前大部分 JVM 所采用的方法,其核心思想是根據對象存活的不同生命周期將內存劃分為不同的域,一般情況下將 GC 堆劃分為老生代(Tenured/Old Generation)和新生代(Young Generation)。老生代的特點是每次垃圾回收時只有少量對象需要被回收,新生代的特點是每次垃圾回收時都有大量垃圾需要被回收,因此可以根據不同區域選擇不同的算法。

2.4.5.1. 新生代與復制算法
目前大部分 JVM 的 GC 對于新生代都采取 Copying 算法,因為新生代中每次垃圾回收都要回收大部分對象,即要復制的操作比較少,但通常并不是按照 1:1 來劃分新生代。一般將新生代劃分為一塊較大的 Eden 空間和兩個較小的 Survivor 空間(From Space, To Space),每次使用Eden 空間和其中的一塊 Survivor 空間,當進行回收時,將該兩塊空間中還存活的對象復制到另一塊 Survivor 空間中。

Java——JVM篇——收藏系列來啦(二)
2.4.5.2. 老年代與標記復制算法
而老年代因為每次只回收少量對象,因而采用 Mark-Compact 算法。

  1. JAVA 虛擬機提到過的處于方法區的永生代(Permanet Generation),它用來存儲 class 類,常量,方法描述等。對永生代的回收主要包括廢棄常量和無用的類。

  2. 對象的內存分配主要在新生代的 Eden Space 和 Survivor Space 的 From Space(Survivor 目前存放對象的那一塊),少數情況會直接分配到老生代。

  3. 當新生代的 Eden Space 和 From Space 空間不足時就會發生一次 GC,進行 GC 后,Eden Space 和 From Space 區的存活對象會被挪到 To Space,然后將 Eden Space 和 From Space 進行清理。

  4. 如果 To Space 無法足夠存儲某個對象,則將這個對象存儲到老生代。

  5. 在進行 GC 后,使用的便是 Eden Space 和 To Space 了,如此反復循環。

  6. 當對象在 Survivor 區躲過一次 GC 后,其年齡就會+1。默認情況下年齡到達 15 的對象會被移到老生代中。

2.5.JAVA 四中引用類型
2.5.1. 強引用
在 Java 中最常見的就是強引用,把一個對象賦給一個引用變量,這個引用變量就是一個強引用。當一個對象被強引用變量引用時,它處于可達狀態,它是不可能被垃圾回收機制回收的,即使該對象以后永遠都不會被用到 JVM 也不會回收。因此強引用是造成 Java 內存泄漏的主要原因之一。

2.5.2. 軟引用
軟引用需要用 SoftReference 類來實現,對于只有軟引用的對象來說,當系統內存足夠時它不會被回收,當系統內存空間不足時它會被回收。軟引用通常用在對內存敏感的程序中。

2.5.3. 弱引用
弱引用需要用 WeakReference 類來實現,它比軟引用的生存期更短,對于只有弱引用的對象來說,只要垃圾回收機制一運行,不管 JVM 的內存空間是否足夠,總會回收該對象占用的內存。

2.5.4. 虛引用
虛引用需要 PhantomReference 類來實現,它不能單獨使用,必須和引用隊列聯合使用。虛引用的主要作用是跟蹤對象被垃圾回收的狀態。

2.6.GC 分代收集算法 VS 分區收集算法
2.6.1. 分代收集算法
當前主流 VM 垃圾收集都采用”分代收集”(Generational Collection)算法, 這種算法會根據對象存活周期的不同將內存劃分為幾塊, 如 JVM 中的 新生代、老年代、永久代,這樣就可以根據各年代特點分別采用最適當的 GC 算法

2.6.1.1. 在新生代-復制算法
每次垃圾收集都能發現大批對象已死, 只有少量存活. 因此選用復制算法, 只需要付出少量存活對象的復制成本就可以完成收集.

2.6.1.2. 在老年代-標記整理算法
因為對象存活率高、沒有額外空間對它進行分配擔保, 就必須采用“標記—清理”或“標記—整理”算法來進行回收, 不必進行內存復制, 且直接騰出空閑內存

2.6.2. 分區收集算法
分區算法則將整個堆空間劃分為連續的不同小區間, 每個小區間獨立使用, 獨立回收. 這樣做的好處是可以控制一次回收多少個小區間 , 根據目標停頓時間, 每次合理地回收若干個小區間(而不是整個堆), 從而減少一次 GC 所產生的停頓

提前一飽眼福,附完整 JVM pdf文檔和最新學習視頻
VX獲取:13272413561

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

辉县市| 金溪县| 聂拉木县| 临猗县| 库车县| 安康市| 英德市| 阜南县| 历史| 万宁市| 宿迁市| 自贡市| 淮阳县| 南投市| 浮梁县| 延安市| 鄂托克前旗| 晋宁县| 蓝田县| 宝山区| 宿州市| 大洼县| 日照市| 寿光市| 玉环县| 兴和县| 宁晋县| 合水县| 泸溪县| 荣成市| 新河县| 马尔康县| 县级市| 筠连县| 仙桃市| 平潭县| 前郭尔| 浦北县| 沧州市| 鹿邑县| 宁南县|