JVM詳解(包括JVM內存模型與GC垃圾回收)

📖前言:

? ? ? ? 學會使用Java對于一個程序員是遠遠不夠的。Java語法的掌握只是一部分,另一部分就是需要掌握Java內部的工作原理,從編譯到運行,到底是誰在幫我們完成工作的?

? ? ? ? 接下來著重對Java虛擬機,也就是JVM有一個深刻認識,對日后完成項目的開發或是更底層的開發有很大的幫助。

? ? ? ? 接下來說的均為個人的一點小見解和觀點,希望大家多多指點!

🎈JVM:

????????JVM 是 Java Virtual Machine 的簡稱,意為 Java虛擬機。

虛擬機是指通過軟件模擬的具有完整硬件功能的、運?在?個完全隔離的環境中的完整計算機系統。

常?的虛擬機:JVM、VMwave、Virtual Box。

JVM 和其他兩個虛擬機的區別:
1 .? VMwave與VirtualBox是通過軟件模擬物理CPU的指令集,物理系統中會有很多的寄存器;
2.JVM則是通過軟件模擬Java字節碼的指令集,JVM中只是主要保留了PC寄存器,其他的寄存器都進?了裁剪。
JVM 是?臺被定制過的現實當中不存在的計算機。

🎨JVM與JDK的關系?

? ? ? ? 知道JVM的基礎概念,可能現在就有點懵了,JVM和JDK有什么關系嗎?那么開始梳理一下與JAVA開發相關的組成部分;

?JDK:

?????? ?官方JDK(Java Development Kit)?是Java開發工具包,包含了Java編譯器(javac)、Java程序打包工具(jar)、Java程序運行環境(JRE)、文檔生成工具(javadoc)以及其他開發工具,如調試的工具(jdb)。JDK是為Java開發人員提供的完整開發環境,包含了開發和運行Java程序所需的一切。

?????????非官方:JDK就是一個工具包,JDK是JRE的超集,JDK包含了JRE的所有開發,調試和監視應用程序等工具。當要開發Java應用程序時,需要安裝JDK.

(JDK里面的工具非常多,是這么多工具才能支撐起我們編寫Java程序)

? ? ? ? 當然有一個重要的組成部分——JRE(Java程序運行環境).

接下來就針對JRE做一個詳細說明:

?JRE:

? ? ? ? 官方JRE(Java Runtime Environment)?是Java運行環境,包含了JVM和Java類庫。JRE是運行Java程序所需的環境,它提供了Java程序運行所需的庫文件和JVM。因此,如果你只需要運行Java程序,那么只需要安裝JRE即可。? ? ? ??

? ? ? ??

需要區分的地方:

????????這里再穿插一下IDEA是什么,IDEA是編寫代碼的平臺,里面集成了一些好用的工具,例如預編譯工具,能夠在出現一些語法錯誤的時候提示我們,但是起到編譯運行的還是JVM虛擬機!

?JVM內存模型:????????

? ? ? ? 首先在開頭處需要聲明一下: JVM內存模型與JMM內存模型不是一回事,JVM內存模型就是虛擬機內部的內存模型,但是JMM內存模型主是描述Java線程之間如如何工作的,如何做到線程之間共享變量的。

? ? ? ? JVM內存模型分為5個區,由這5個區合力搭建出JVM內存模型的。

程序計數器:記錄了要執行的下一條指令的地址

棧:

? ? ? ? 虛擬機棧:保存臨時變量、參數、函數調用的關系

? ? ? ? 本地方法棧:與虛擬機棧類似、底層是C或C++代碼

堆:保存了new的對象

方法區(元數據區):保存了靜態變量、常量、常量池等

? ? ? ? 棧區、程序計數器是線程私有的

? ? ? ? 堆區、方法區是線程共享的?

🏉類加載過程:

? ? ? ? 了解了JVM內存模型,接下來需要了解.class文件在JVM讀取與加載的過程。

? ? ? ? 1.加載:讀取.class文件中的內容

? ? ? ? 2.驗證:校驗讀取到的內容是否符合JVM規范。

? ? ? ? 3.準備:為類的靜態變量分配內存,并將其初始化為默認值。

? ? ? ? 4.解析:將符號引用全部替換為直接引用

? ? ? ? 5.初始化:此階段是執行類構造器()方法的過程。此方法由編譯器自動收集類中的所有類變量的賦值動作和靜態語句塊(static{}塊)中的語句合并而成。當初始化一個類的時候,如果發現其父類還未進行初始化,則需要先觸發其父類的初始化。Java虛擬機會保證一個類的()方法在多線程下被同步加鎖。

?雙親委派模型:

? ? ? ? 在類加載時,需要遵循雙親委派模型:

? ? ? ? 如果一個類被請求加載時,首先不會自己加載,將加載的請求拋給父類,如果父類可以加載,自己就不再加載,如果父類不能加載,自己再進行加載。

優先級由高到低:標準庫類加載器->擴展庫類加載器->第三方庫類加載器->自定義類加載器

? ? ? ? 如下圖:

雙親委派模型作用:? ? ? ?

1. 避免重復加載類: ?如 A 類和 B 類都有?個?類 C 類,那么當 A 啟動時就會將 C 類加載起來,那么在 B 類進?加載時就不需要在重復加載 C 類了。
2. 安全性 :使?雙親委派模型也可以保證了 Java 的核? API 不被篡改,如果沒有使?雙親委派模型,?是每個類加載器加載??的話就會出現?些問題,?如我們編寫?個稱為 java.lang.Object類的話,那么程序運?的時候,系統就會出現多個不同的 Object 類,?有些 Object 類?是用戶自己提供的因此安全性就不能得到保證了。

🥎類初始化順序(帶有繼承關系):

? ? ? ? 父類靜態代碼塊、靜態變量->子類靜態代碼塊、靜態變量->父類普通變量->父類構造函數->子類普通方法->子類構造方法

🏀GC垃圾回收:

? ? ? ? 首先需要搞清楚,哪里的垃圾需要回收,那里的垃圾不需要回收?????????

? ? ? ? 線程私有的區域中的垃圾我們不需要回收,當線程結束時,這些區域也會跟著清空

? ? ? ? 線程共享的區域,如果線程結束,但是線程共享區中的引用對象不會隨之消失。

? ? ? ? 因此著重關注的是兩個區域——堆區、方法區

? ? ? ? 但是相較于創建的量和空間的消耗來說,堆區是垃圾回收的重災區,但是方法區也有垃圾回收機制,但是不怎么關注。

🏐如何判斷該對象是否是垃圾?

? ? ? ? 如何判定堆區中的對象就是垃圾呢?有以下幾種方法:

🍿1.引用計數法:

? ? ? ? 采用計數的方式,如何一個對象被引用,此時計數器+1,如何不在引用該對象計數器的值就-1。

造成的問題:

? ? ? ? 如果采用方法進行垃圾的判定,會造成"循環引用"的問題,例如:

class Student{private String name;public Student student;public Student(String name) {name = this.name;}
}
public class Test {public void circulation(){Student a = new Student("a");Student b = new Student("b");a.student = b;b.student = a;a = null;b = null;}
}

此時明明a、b兩個引用已經斷開指向a、b的對象,但是其內部還有相互的指向,沒有辦法被釋放了。

🍕2.可達性分析:

? ? ? ? 為了解決上述出現的問題,可以定期進行掃描,如果發現雖然被引用著,但是到達不了GCroots也會被視為垃圾,如下圖:

????????? ? ? ? ? ? ?

?????????也就是從GC Roots開始掃描,如果是能到達的對象此時構成了引用鏈,如果在某個對象在經過下次掃描不在這條引用鏈上了,就被視為"垃圾"。

? ?該方法被作為GC垃圾回收的首選方法。但是在這個過程中可能會造成STW(Stop The World),可以理解為時間停頓。

🥯垃圾回收方法:

? ? ? ? 通過可達性分析以后判斷出哪些對象是垃圾,接下來就來談一談這些垃圾是如何被回收的?

有以下方法:

🌭?1.標記回收:

? ? ? ? 經過可達性分析以后,如果是垃圾,此時被標記一下。之后經過多輪檢測之后,將標記的垃圾進行清除:

????????

缺點:

? ? ? ? 造成內存碎片化問題,此時在存儲效率上會大減折扣。

🧇2.標記整理:

? ? ? ? 在標記回收算法的基礎上,進行改良,因為上述的做法會造成內存碎片問題,如果每次回收以后,對內存中存活的對象繼續寧整理,整理在一起,此時內存空間可利用率會提高。

????????

缺點:

? ? ? ? 整理復制需要消耗大量的實踐,時間效率降低。

🧈3.復制算法:

? ? ? ? 如果我么每次將內存空間分為兩部分,一部分空出來,另一部分使用,垃圾回收只需要對使用的一部分進行回收,進行標記,經過多輪之后,將存活的對象復制到另一塊沒有使用的內存當中。

?

缺點:

? ? ? ? 如果存活的對象較多,此時復制時比較消耗時間。

🍞4.分代回收算法:

? ? ? ? 將堆區中的區域劃分為新生代與老年代

?

新生代又被劃分為:伊甸區、幸存區

  • 堆內存為兩個區:新生代 (Young) 和老年代 (Old);
  • 新生代默認占堆內存的 1/3,老年代默認占堆內存的 2/3;
  • 新生代又分為 Eden 區、Survivor From區、Survivor To區默認比例是 8:1:1? ?

過程:

? ? ? ? 首次被創建的對象先進入伊甸區,之后經過可達性分析與復制算法,將幸存的對象放入幸存區,再次經多輪過可達性分析與復制算法,此時將最終存活的對象放入老年代。老年代中進行可達性分析的頻次就比較低了。

😶常見的GC垃圾回收器:

? ? ? ? 上述講的都是一些垃圾回收的一些思路,這些GC垃圾回收器內部回收垃圾時都有用到上述的思路。

1??1.GMS垃圾收集器:

? ? ? ? 老年代收集器,并發GC,GMS是一種獲取最短停頓時間(STW)為目標的收集器。

實現原理:

? ? ? ? 其內部是基于標記-清除算法實現的。(具體大家可以自行了解)

由于整個過程中耗時最?的并發標記和并發清除過程收集器線程都可以與??線程?起?作,所以,從總體上來說,CMS收集器的內存回收過程是與??線程?起并發執?的。? ? ? ?

2??2.G1垃圾收集器 :

? ? ? ? 全區域的垃圾收集器,其主要的做法是將分代回收算法中的區域劃分為更小的區域塊,此時不再是一次性進行復制算法回收,只對一部分進行可達性分析+復制算法回收。

年輕代垃圾收集:
????????在G1垃圾收集器中,年輕代的垃圾回收過程使?復制算法。把Eden區和Survivor區的對象復制到新的Survivor區域。
老年代垃收集:
對于?年代上的垃圾收集,G1垃圾收集器也分為4個階段,基本跟CMS垃圾收集器?樣,但略有不同:
初始標記 (Initial Mark)階段 - G1需要暫停應?程序的執?,它會標記從根對象出發,在根對象的第?層孩?節點中標記所有可達的對象。但是G1的垃圾收集器的Initial Mark階段是跟minor gc?同發?的。也就是說,在G1中,你不?像在CMS那樣,單獨暫停應?程序的執?來運?Initial Mark階段,而是在G1觸發minor gc的時候?并將年?代上的Initial Mark給做了。
并發標記 (Concurrent Mark)階段 - 在這個階段G1做的事情跟CMS?樣。但G1同時還多做了?件事 情,就是如果在Concurrent Mark階段中,發現哪些Tenured region中對象的存活率很?或者基本沒有對象存活,那么G1就會在這個階段將其回收掉,?不?等到后?的clean up階段。這也是Garbage First名字的由來。同時,在該階段,G1會計算每個 region的對象存活率,?便后?的clean up階段使? 。
最終標記 (CMS中的Remark階段) - 在這個階段G1做的事情跟CMS?樣, 但是采?的算法不同,G1采??種叫做SATB(snapshot-at-the-begining)的算法能夠在Remark階段更快的標記可達對象。
篩選回收( Clean up/Copy)階段 - 在G1中,沒有CMS中對應的Sweep階段。相反 它有?個Cleanup/Copy階段,在這個階段中,G1會挑選出那些對象存活率低的region進?回收,這個階段也是和minor gc?同發?的。

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

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

相關文章

【無標題】大亞灣文化體育場多美啊。

請推薦一些常用并且免費的,可直接在線運行【Python】代碼的平臺并列出對應網址 好的,用戶想讓我推薦一些常用且免費的、可以直接在線運行Python代碼的平臺,并且需要列出對應的網址。我需要先回想一下自己知道的在線Python運行環境&#xff0…

權限提升—Windows權限提升土豆家族溢出漏洞通殺全系

前言 OK,Java安全更新不下去了,實在是太難啦啊,想起來提權這一塊沒怎么更新過,接下來都主要是更新提權這一塊的文章了,Java安全的話以后有耐心再搞了。 手動提權 今天主要是講這個手動的提權,手動提權相…

Vue3 知識點總結

Vue3 知識點總結 1. 核心概念 1.1 Composition API 1.1.1 setup 函數 setup是Vue3中的新的配置項,是組件內使用Composition API的入口在setup中定義的變量和方法需要return才能在模板中使用setup執行時機在beforeCreate之前,this不可用 export defa…

python --face_recognition(人臉識別,檢測,特征提取,繪制鼻子,眼睛,嘴巴,眉毛)/活體檢測

dlib 安裝方法 之前博文 https://blog.csdn.net/weixin_44634704/article/details/141332644 環境: python3.8 opencv-python4.11.0.86 face_recognition1.3.0 dlib19.24.6人臉檢測 import cv2 import face_recognition# 讀取人臉圖片 img cv2.imread(r"C:\Users\123\…

【bug】[42000][1067] Invalid default value for ‘xxx_time‘

MySQL錯誤解決:Invalid default value for xxx_time’問題分析與修復方案 問題描述 在MySQL數據庫操作中,當嘗試創建或修改表結構時,可能會遇到以下錯誤信息: [bug] [42000][1067] Invalid default value for xxx_time這個錯誤…

Go環境相關理解

Linux上安裝的環境變量 ## set go env export GOPATH$HOME/go_workspace export GOPATH/usr/local/go export PATH$PATH:$GOPATH/bin go.mod 和go.sum的理解 go.mod文件 ?go.mod文件定義了模塊的路徑和依賴版本?。它遵循 語義化版本2.0.0規范,記錄了當前項目所依…

Next.js 深度解析:全棧React框架的架構哲學與實踐精髓

Next.js 作為 React 生態中最流行的全棧框架,已經超越了簡單的SSR工具,發展成為完整的Web開發解決方案。以下從八個維度進行深度剖析: 一、核心架構設計 雙引擎驅動模型 頁面路由系統:基于文件系統的約定式路由渲染引擎&#xff…

禾賽盈利了,但激光雷達沒有勝利

還遠沒有到激光雷達黨歡呼的時候。 3月,隨著禾賽科技公布2024年報,全世界第一家也是唯一一家實現全年盈利的激光雷達上市公司誕生,為了這個盈利目標,禾賽科技奮斗了十年。 但極大的出貨量和不高的盈利水平,讓禾賽科技…

心房顫動新機制:ATM/p53通路早期抑制

急性心肌梗死(AMI)是心血管疾病中的“大魔頭”,它悄無聲息地侵蝕著心臟的肌肉,導致心臟功能受損,嚴重時甚至危及生命。而心房顫動(AF),這一常見的心律失常,往往在AMI后悄…

Linux 安裝 Redis

虛擬機安裝 linux https://www.bilibili.com/video/BVldD42177qg?p16 1、安裝 gcc,編譯環境 yum y install gcc-g 2、將 redis-7.2.4.tar.gz放到 linux。如,放到 opt 里 3、進入/opt 目錄下,解壓 tar -zxvf redis-7.2.4.tar.gz 4、進入 redis-7.2.4.tar…

六級備考 詞匯量積累(day11)

sculpture 雕像 allege 指責,聲稱 pledge 發誓 breach 違背,違反 defaulty 違約,違反 infringe 侵犯 infringing on small farmers interest blacmail 勒索 idle 無所事事的 deceive 欺騙 perceive 察覺 conceive 設想 conception 設想 verdi…

關于金碟K3,禁用和啟用需要流程審批后執行

真是難受,是設計師蠢呢自己問題比較多呢,現在都還沒有弄好 點擊禁用和啟用,通過流程來執行 到底是蠢呢還是設計問題,搞了半日沒有效果,搞那么復雜! 而且有樣板都沒有草鞋成功 BOS設計,表單屬性,操作列表: 1、啟用禁用流程

導入 Excel 規則批量修改或刪除 PDF 文檔內容

需要對 PDF 文檔內容進行修改的時候,通常我們會需要借助一些專業的工具來幫我們完成。那我們如果需要修改的 PDF 文檔較多的時候,有什么方法可以幫我們實現批量操作呢?今天這篇文章就給大家介紹一下當我們需要批量修改多個 PDF 文檔的時候&am…

msyql--基本操作之運維篇

檢查 root 用戶的權限 查看該用戶針對這個數據庫的權限 -- 如果在終端連接mysql時需要 mysql -u root -p -- 查看用戶權限 SELECT user, host FROM mysql.user WHERE user root;可以看的出來root有他的訪問權限,如過沒有localhost或者% 說明沒有訪問權限 添加…

Vue 3使用 Socket

在 Vue 3 中使用 Socket(如 WebSocket 或基于 WebSocket 的庫比如 Socket.IO)可以通過組合式 API(Composition API)來實現得更清晰、模塊化。下面我給你展示一個完整的例子,包括使用原生 WebSocket 和使用 Socket.IO 的…

云計算:探索現代科技的未來之云

文章目錄 云計算基本概念云計算是什么注意 云計算的價值云計算的部署模式云計算的服務模式主流的云計算技術AWS簡介AWS建立了廣闊的合作伙伴生態 VMware簡介VMware服務介紹 華為云簡介華為云Stack模式 云計算基本概念 云計算是什么 云計算是一種模型,它可以實現隨時…

光學像差的類型與消除方法

### **光學像差的類型、理解與消除方法** 光學像差是指實際光學系統成像時,由于透鏡或反射鏡的非理想特性導致的光線偏離理想路徑,從而影響成像質量的現象。像差可分為**單色像差**(與波長無關)和**色差**(與波長相關…

什么是ecovadis驗廠?ecovadis驗廠的好處?ecovadis驗廠的重要意義

1. 什么是EcoVadis驗廠? EcoVadis驗廠(又稱EcoVadis評估)是國際權威的 企業社會責任(CSR)和可持續發展(ESG)在線評估,通過審核企業在 環境、勞工與人權、商業道德、可持續采購 四大…

STM32蜂鳴器播放音樂

STM32蜂鳴器播放音樂 STM32蜂鳴器播放音樂 Do, Re, Mi, Fa, 1. 功能概述 本系統基于STM32F7系列微控制器,實現了以下功能: 通過7個按鍵控制蜂鳴器發聲,按鍵對應不同的音符。每個按鍵對應一個音符(Do, Re, Mi, Fa, Sol, La, Si&a…

基于 OCO - 2 氧氣 A 帶輻射數據與地面臺站氣壓觀測數據構建近地面氣壓監測算法方案

基于 OCO - 2 氧氣 A 帶輻射數據與地面臺站氣壓觀測數據構建近地面氣壓監測算法方案 一、數據獲取與準備 (一)OCO - 2 氧氣 A 帶輻射數據 數據下載:從 OCO - 2 官方數據發布平臺(如 NASA 的相關數據存儲庫),按照研究所需的時間范圍(例如,近 5 年的數據以獲取足夠的樣本…