先有JVM還是先有垃圾回收器?很多人弄混淆了

是先有垃圾回收器再有JVM呢,還是先有JVM再有垃圾回收器呢?或者是先有垃圾回收再有JVM呢?歷史上還真是垃圾回收更早面世,垃圾回收最早起源于1960年誕生的LISP語言,Java只是支持垃圾回收的其中一種。下面我們就來刨析刨析JVM的垃圾回收~

在這里插入圖片描述

文章目錄

    • 1. 判斷可回收對象
      • 1.1 引用計數法
      • 1.2 可達性分析算法
    • 2. 垃圾回收器
      • 2.1 垃圾回收區域
      • 2.2 回收永久代
      • 2.3 垃圾回收器
      • 2.4 CMS原理
      • 2.5 CMS的缺點
      • 2.6 G1垃圾回收器
    • 3. 垃圾回收算法
      • 3.1 優化復制算法
    • 未完待續。。。

1. 判斷可回收對象

1.1 引用計數法

面試官:JVM為什么不采用引用計數法?

每個Java對象在引用計數法里都有一個引用計數器,引用失效則計數器 - 1,有新的引用則計數器 + 1,通過計數器的數值來判斷該對象是否是可回收對象。

大家看下這個例子,如果對象A和對象B沒有被任何對象引用,也沒有被任何線程訪問,這兩個對象按理應該被回收。但如果對象A的成員變量引用了對象B,對象B的成員變量引用了對象A,它們的引用計數器數值都不為0,通過引用計數法并不能將其視為垃圾對象。

    class A {B b = new B();}class B {A a = new A();}

就因為引用計數法很難解決對象之間相互循環引用的問題,所以目前JVM采用可達性分析算法來判斷Java對象是否是可回收對象。

1.2 可達性分析算法

面試官:那你講講可達性分析算法?

可達性分析顧名思義就是以某個起始點來判斷它是否可達,這個起始點稱為GC Roots。如果Java對象不能從GC Roots作為起始點往下搜索到,那該對象就被視為垃圾對象,即可回收對象。

在這里插入圖片描述

可以作為GC Roots對象一共包括以下四種,這點也是面試官常問的:

  1. 虛擬機棧中引用的對象。
  2. 本地方法棧中引用的對象。
  3. 方法區中類靜態屬性引用的對象。
  4. 方法區中常量引用的對象。

2. 垃圾回收器

2.1 垃圾回收區域

面試官:垃圾回收器回收的是哪個區域?

JVM由五大區域組成:堆內存、方法區、程序計數器、虛擬機棧、本地方法棧。先說結論,垃圾回收器回收的是堆內存和方法區兩大區域。

程序計數器、虛擬機棧、本地方法棧的內存分配和回收都具備確定性,都是隨著線程銷毀而銷毀,因此不需要進行回收

但在堆內存、方法區中,內存分配和回收都是動態的,我們只有在運行期間才能知道會創建哪些對象;另外這些垃圾對象不會自動銷毀,如果任由這兩部分區域的垃圾對象不管,勢必造成內存的浪費甚至有內存泄漏的可能。

垃圾回收器存在的意義就是通過自動檢測和回收這些垃圾對象,來減少內存泄漏的風險。

2.2 回收永久代

面試官:那永久代不會進行垃圾回收對吧?

雖然永久代的垃圾回收效率是比較低的,但永久代里的廢棄常量和無用的類仍然會被回收。

例如創建一個字符串常量name,該字符串會存在于常量池中。如果該字符串沒有任何String對象去引用它,當發生內存回收時有必要會清除該廢棄常量。

private static final String name = "JavaGetOffer";

2.3 垃圾回收器

面試官:你說說都有哪些垃圾回收器?

目前市面上共有七種垃圾回收器。

  1. Serial是一個作用在新生代單線程垃圾回收器。在垃圾回收期間系統的所有線程都會阻塞,因此垃圾回收效率也相對較高

  2. ParNew則是Serial的多線程版本。這也是第一款并發的垃圾回收器,相比Serial來說垃圾回收不需要阻塞所有線程,第一次實現了讓垃圾回收線程和用戶線程同時工作。

  3. Serial Old是Serial的老年代版本。

  4. Parallel Scavenge同樣是作用在新生代且是多線程,不過它的設計目標是達到一個可控制的吞吐量

  5. Parallel Old是Parallel Scavenge收集器的老年代版本,我們可以把它和Parallel Scavenge搭配一起使用。

  6. CMS是一種以最短停頓時間為目標的多線程收集器,下文我會介紹CMS實現最短停頓的原理。

  7. G1收集器可以說是CMS的升級版

我們可以根據業務實際情況來為各個年代搭配不同的垃圾回收器,以下的垃圾回收器如果有線連接,說明它們之間可以搭配使用。

在這里插入圖片描述

2.4 CMS原理

面試官:你說的CMS為什么有較短的停頓?

CMS采用了標記-清除算法,整個運作過程分為了初始標記、并發標記、重新標記、并發清除四個階段。

其中初始標記、重新標記的停頓時間是比較短的,而耗時最長的并發標記、并發清除能夠和用戶線程一起并發工作不需要停頓,可以說CMS只需要造成初始標記、重新標記帶來的短時間停頓。

2.5 CMS的缺點

面試官:那它有什么缺點?

  1. CMS是多線程的,在垃圾回收時會占用一部分線程,可能會使系統變得相對較慢。
  2. CMS并發清理時用戶線程還在運行著,也就是說還會有新的垃圾不斷產生,這些垃圾被稱為浮動垃圾。因為浮動垃圾產生在標記階段后,很明顯CMS本次收集是無法處理這些浮動垃圾的,只能等到下一次GC回收。
  3. CMS采用標記-清除算法,標記-清除算法的缺點是會產生空間碎片,有可能造成大對象找不到足夠的連續空間而發生OOM的情況。

2.6 G1垃圾回收器

面試官:你說G1是CMS的升級版,為什么?

G1垃圾回收器設計之初被賦予的使命是未來可以替換掉JDK1.5中發布的CMS垃圾回收器。所以大家可想而知,CMS垃圾回收器的優點G1垃圾回收器都有,另外G1垃圾回收器也避免了CMS的一些不足。

  1. G1采用的垃圾回收算法是標記-整理算法,避免了CMS采用標記-清除可能產生的空間碎片。
  2. 其他收集器在新生代、老年代分別采用不同收集器進行配合,而G1垃圾回收器可以不需要其他收集器配合就能獨立管理整個GC。

3. 垃圾回收算法

面試官:垃圾回收算法都有什么?

垃圾回收算法一共有四種,其中最基礎的垃圾回收算法是標記-清除算法,其他算法其實都是對標記-清除算法的優化而產生的,我們繼續往下看。

(1)標記-清除算法。

標記-清除算法顧名思義分為標記清除兩個階段,首先標記出所有可回收的對象,標記完成后統一進行清除。但該算法有一個缺點,被標記和未標記的對象都是分散存儲在內存中的,當清除標記對象后會出現空間碎片的情況,如下圖:

在這里插入圖片描述

(2)復制算法。

復制算法把內存劃分為容量相等的兩塊,每次只使用一塊,當這一塊內存不足時就將存活的對象復制到另一塊中,同時清除當前塊的內存空間。這種算法實現簡單且運行高效,也不會產生空間碎片的情況,因為新生代的GC是比較頻繁的,所以復制算法也廣泛用于新生代的垃圾回收。但缺點很明顯是浪費了50%的內存空間

(3)標記-整理算法。

標記-整理算法是對標記-清除算法的優化。該算法在內存到達一定量后,會把所有已標記的垃圾對象都向一端里移動,然后以存活對象所在的一端為邊界,清除邊界內所有內存,避免了標記-清除算法可能產生的空間碎片。

(4)分代收集算法。

一般實際業務系統都是采用分代收集算法。分代顧名思義把JVM內存拆分,分為了新生代、老年代,對不同年代的垃圾回收采用不同的垃圾回收算法來確保回收效率。

大家可以看下自己公司的JDK使用了什么垃圾回收器,加深下對本篇的理解。

# 打印JVM啟動時的命令行標志
java -XX:+PrintCommandLineFlags -version

3.1 優化復制算法

面試官:復制算法可以怎么優化嗎?

復制算法把內存劃分為容量相等的兩塊,也就是按1:1分配內存,但這也浪費了50%空間

可以把內存分為一塊較大的Eden空間和兩塊較小的Survivor空間,每次只使用Eden空間和其中一塊Survivor空間,而另一塊Survivor空間用來保存回收時還存活的對象。這樣就只浪費了其中一塊Survivor空間的內存。

?覆蓋Java程序員所需掌握的Java核心知識、面試重點,本博客收錄在我開源的《Java學習面試指南》中,會一直完善下去,希望收到大家的 ? Star ?支持,這是我創作的最大動力: https://github.com/hdgaadd/JavaGetOffer

未完待續。。。

創作不易,不妨點贊、收藏、關注支持一下,各位的支持就是我創作的最大動力??

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/12927.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/12927.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/12927.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

外賣系統的JWT實現登錄

1、什么是JWT jwt可以生成一個加密的token,作為用戶登錄的令牌,當用戶登陸成功之后,發放給客戶端。請求需要登錄的資源或者接口的時候,將token攜帶,后端驗證token是否合法。jwt有三部分組成: A:…

【特大喜訊】國內前33位持有PMI-RMP風險管理專業認證的學員分享~!

【學員背景】 沈陽某信息科技有限公司,從事企業采購供應鏈數字化轉型方向; 為企業提供有效的降本增效解決方案。 【學員順利拿證后期訪問】 問:學員您好,首先恭喜您順利拿到RMP證書,請問您在此次備考過程中&#xf…

抖店商品詳情API接口(產品參數|詳情圖)

抖店商品詳情API接口(產品參數|詳情圖) 參數僅供參考: {"code": 0,"msg": "調用成功","time": "1715763239","data": {"properties": [{"format": [{"message": [{&q…

C語言簡要(一)

總得讓她開心吧 helloworld #include <stdio.h>int main() {printf("hello world!\n");return 0; } 程序框架 #include <stdio.h> int main {return 0; }輸出 printf("hello world!\n"); "里面的內容叫做“字符串”&#xff0c;prin…

BUUCTF靶場[MISC]wireshark、被嗅探的流量、神秘龍卷風、另一個世界

[misc]wireshark 考點&#xff1a;流量、追蹤流 工具&#xff1a;wireshark 先看題目&#xff0c;管理員密碼 將下載的文件用wireshark打開&#xff0c;查找flag 點擊追蹤tcp流&#xff0c;開始挨個查看flag [misc]被嗅探的流量 考點&#xff1a;流量、追蹤流 工具&#xf…

武漢星起航:亞馬遜構建綜合性商業生態,賣家買家共享全球化紅利

在當今全球化日益加速的時代&#xff0c;亞馬遜不僅以其卓越的電商平臺服務全球消費者&#xff0c;更通過一系列前沿服務打造了一個綜合性的商業生態系統。在這個生態系統中&#xff0c;賣家能夠輕松拓展全球業務&#xff0c;買家則享受到了前所未有的購物體驗。亞馬遜以其獨特…

FreeRTOS【6】線程優先級

1.開發背景 基于上一篇指引&#xff0c;已經了解了線程的阻塞&#xff0c;這個篇章主要介紹線程優先級的影響 2.開發需求 設計實驗驗證高優先級會搶占低優先級線程 CPU 3.開發環境 window10 MDK STM32F429 FreeRTOS10.3.1 4.實現步驟 1&#xff09;創建測試線程&#xff…

測試之路 - 精準而優雅

引子 這幾年業內一直在做精準測試&#xff0c;大都使用工具 diff 代碼改動、分析代碼覆蓋率這些平臺集成的能力。 業務測試中&#xff0c;我們在技術設計和代碼實現的基礎上也做了一些精減和精準的測試實踐&#xff0c;通過深入測試有針對的設計 case&#xff0c;發現隱藏問題…

抖音小程序使用Vant

安裝 Vant 有針對小程序的版本&#xff0c;通過npm安裝&#xff1a; npm i vant/weapp -S --production構建 npm 安裝 Vant Weapp 后需要構建 NPM&#xff0c;在菜單的【工具】選項中選擇【構建 NPM】&#xff1a; 使用組件 抖音小程序和微信小程序還是有一些差別的&#x…

怎么把3d模型導出cad立面---模大獅模型網

在設計工作中&#xff0c;將3D模型導出到CAD軟件并生成立面圖是一項常見但關鍵的任務。這不僅有助于更好地展示設計方案&#xff0c;還能方便后續的工程制圖和施工。本文將介紹如何通過3ds Max軟件將3D模型導出到CAD軟件&#xff0c;并生成高質量的立面圖&#xff0c;為您提供實…

現貨正泰漏電小型斷路器NXB-32LE-C16 30MA1P+N原裝正品NXB-40L

品牌&#xff1a;CHNT/正泰 型號&#xff1a;NXBLE 額定電流&#xff1a;25A,16A,20A,40A,32A 漏電保護器類型&#xff1a;2P 產地&#xff1a;中國大陸 電壓&#xff1a;1000V及以下 極數&#xff1a;3P,4p,2P,1PN 電源方式&#xff1a;交流電 3C證書編號&#xff1a;…

大模型時代下的先行者:景聯文科技引領數據標注新時代

在大模型時代&#xff0c;數據標注不再是簡單的分類標注&#xff0c;而是一項融合了技術革新、專業技能、法律合規和精細化管理的綜合性任務&#xff0c;對推動AI技術的發展和落地應用具有重要意義。 景聯文科技作為AI基礎行業的數據供應商&#xff0c;可協助人工智能企業解決整…

easyx快速入門1

1.基本說明 EasyX 是針對 C 的圖形庫&#xff0c;可以幫助 C/C 初學者快速上手圖形和游戲編程。 比如&#xff0c;可以基于 EasyX 圖形庫很快的用幾何圖形畫一個房子&#xff0c;或者一輛移動的小車&#xff0c;可以編寫俄羅斯方塊、貪吃蛇、黑白棋等小游戲&#xff0c;可以練…

fl studio試用版文件保存無法打開??一個方法教你免費打開!

前言 當下&#xff0c;各款編曲軟件五花八門&#xff0c;而這其中最有聲譽的必為FL Studio莫屬 這個軟件呢國人習慣叫他水果&#xff0c;擁有強大的錄音、編曲、混音等功能&#xff0c;所以廣受音樂圈歡迎。如今&#xff0c;大部分水果一旦有編曲所需&#xff0c;一般都要使用…

【Python快速上手(二十三)】

目錄 Python快速上手&#xff08;二十三&#xff09;Python3 多線程1. 線程的創建2. 線程同步2.1 鎖&#xff08;Lock&#xff09;2.2 信號量&#xff08;Semaphore&#xff09;2.3 事件&#xff08;Event&#xff09;2.4 條件&#xff08;Condition&#xff09; 3. 線程優先級…

【Linux】Centos9設置ActiveMq開機自啟功能

配置流程&#xff1a; 1. 創建 Systemd 服務文件。這個文件通常存放在/usr/lib/systemd/system/目錄下&#xff0c;命名為 activemq.service。 #先創建文件&#xff0c;然后編輯&#xff1a; sudo touch /usr/lib/systemd/system/activemq.service sudo vim /usr/lib/systemd…

CSS 根據子元素選擇父元素,并設置父元素的樣式

場景舉例&#xff1a;當子元素有增加了一個class時&#xff0c;需要影響其父元素的樣式 可以使用":has"偽類來實現選擇父元素的效果 <style>.parent:has(.child){background-color: #eee;}p{width:100px;border:1px solid #000;} </style> <body>…

Python3 筆記:for語句和while語句的區別

一般來說&#xff0c;循環次數確定的問題使用for循環或者while循環都可以解決&#xff0c;而循環次數不確定的問題只能使用while循環解決。 for語句的格式&#xff1a; for 循環變量 in 遍歷對象: 語句 while語句的格式&#xff1a; while 條件表達式: 循環體 for…

人機協同中的比較、調整與反轉

人機協同是指人與機器之間的合作關系&#xff0c;通過共同努力實現特定任務的目標。在人機協同中&#xff0c;存在著比較與調整的過程&#xff0c;這是為了實現更好的合作效果和任務完成質量。 比較是指人與機器在任務執行過程中對彼此的表現進行評估和比較。這可以通過對機器的…

DB類的學習

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Data; //引用三個命名空間 using System.Data.SqlClient; using System.Configuration;/// <summary> /// DB 的摘要說明 /// </summary> public class DB {p…