【JavaEE 初階(十)】JVM

?博主主頁: 33的博客?
??文章專欄分類:JavaEE??
🚚我的代碼倉庫: 33的代碼倉庫🚚
🫵🫵🫵關注我帶你了解更多進階知識

在這里插入圖片描述

目錄

  • 1.前言
  • 2.JVM內存區域劃分
  • 3.類加載
    • 3.1雙親委派模型
  • 4.垃圾回收(GC)
    • 4.1垃圾識別
      • 4.1.1引用計數
    • 4.1.2可達性分析
    • 4.2垃圾釋放
    • 4.2.1標記釋放
    • 4.2.2復制算法
    • 4.2.3標記整理
    • 4.2.4分代回收
  • 5.總結

1.前言

JVM 是 Java Virtual Machine 的簡稱,意為 Java虛擬機。虛擬機是指通過軟件模擬的具有完整硬件功能的、運行在一個完全隔離的環境中的完整計算機系統,JVM本省是一個比較復雜的東西,我主要從三個方面進行講述:內存區域劃分,類加載機制垃圾回收算法。

2.JVM內存區域劃分

JVM其實就是一個進程,進程在運行過程中,要從操作系統申請資源空間,JVM申請的空間會劃分為幾個不同的區域,每個區域作用各不相同。這些資源支持了后續Java程序的執行。
在這里插入圖片描述
堆區:整個進程只有一份,代碼中new出來的對象,對象中的非靜態成員變量,放在堆區
棧區:虛擬機棧記錄了JAVA代碼中的調用關系,java局部變量。
程序計數器:專門用來存儲下一條Java指令的地址
元數據:整個進程只有一份,一些輔助性質的,描述性質的屬性,我們所寫的JAVA代碼,各種邏輯運算,會通過javac完成代碼轉換成字節碼,此時這些字節碼在程序運行時就會被JVM加載到元數據中,此時當前程序如何執行,做哪些事就按照上述元數據區記錄的字節執行。
下列元素n,m,t各在什么區?

class Test{
int n;
static int m;
}
main(){
Test t=new Test();
}

t為局部變量在棧區
new Test在堆區
n是成員變量也在堆中
m是static修飾,類屬性在元數據區

3.類加載

類加載就是指JAVA程序運行是,把.class文件從硬盤中讀到內存,再進行一系列解析。
類加載大致可以分為5步:
1)加載
把硬盤上的.class文件找到,打開文件讀取文件內容
2)驗證
確保讀到的文件內容是合法的
3)準備
給類申請內存空間,默認值為全0
4)解析
主要針對類中的字符串常量進行處理
例如有一串代碼為String s=”hello";s變量存入的是hello的地址,但是再.calss文件中不純在地址的概率,那么為了就可以給s填一個偏移量。
在這里插入圖片描述

5)初始化
把類對象的各個部分的屬性進行賦值填充

3.1雙親委派模型

在類加載的時候有一個重要模型就是雙親委派模型,描述了如何找到.class文件。在進行加載操作的時候有一個專門的模塊叫做類加載器,默認含有三個
BootstrapClassLoader:負責查找標準庫的目錄
ExtensionClassLoader:負責查找擴展庫的目錄
ApplicationClassLoader:負責查找當前項目的代碼目錄,第三方庫目錄
上述三個類加載器存在父子關系,類似于二叉樹,有一個指針指向父類加載器
在這里插入圖片描述
雙親委派工作流程:
1)從ApplicationClassLoader作為入口,開始工作
2)ApplicationClassLoader不會立即搜索自己負責的目錄,會把搜索的任務交給自己的父親
3)進入ExtensionClassLoader,也不會立即搜索自己負責的目錄,也會把搜索的任務交給自己的父親
4)進入BootstrapClassLoader,不會立即搜索自己負責的目錄,也會把搜索的任務交給自己的父親
5)BootstrapClassLoader發現自己沒有父親節點,此時會真正的搜索負責的目錄,如果找到了就執行后續操作,沒有找到就返回給孩子
6)ExtensionClassLoader收到父親的任務以后,會搜索自己負責的目錄,如果找到了就執行后續操作,沒有找到就返回給孩子
7)ApplicationClassLoader收到父親的任務以后,會搜索自己負責的目錄,如果找到了就執行后續操作,沒有找到就返回給孩子,但如果沒有孩子就說明類加載失敗,拋出ClassNotFoundException

4.垃圾回收(GC)

垃圾回收是回收的內存,其中主要回收的是堆中的內存,棧中的內存在代碼塊結束以后會自動銷毀。那么垃圾回收具體是怎么展開的呢?主要分為垃圾識別和垃圾釋放

4.1垃圾識別

判定new出來的對象在后續是否要使用,如果不再使用舊標記為垃圾。
例:

void func(){
Test t=new Test();
t.find();
}

當程序執行到}時,t就被釋放,此后就不再使用new Test()對象了,就可以標記為垃圾,但如果有些大媽比較復雜,例如

Test t=new Test();
Test m=t;
Test n=m;
Test z=n;

此時就有很多引用指向new Test()對象,就學要確保沒有任何一個引用指向這個對象才能標記為垃圾,那么我們怎么知道什么時候沒有引用指向它呢?

4.1.1引用計數

當我們創建一個對象時,給每個對象分配一個額外的空間記錄當前對象有幾個引用。
在這里插入圖片描述
每增加一個引用,計數位置+1,每減少一個引用,技術位置-1,如果為0就標記為垃圾
問題一
這樣會消耗額外的空間,當我們的對象非常多,但對象的體積非常小,那么久可能導致計數所占的空間就占了所有空間的大部分。
問題二
可能會引起循環引用,那么就永遠釋放不了資源

class Test{
Test t;
}
Test a=new Test();
Test b=new Test();
a.t=b;
b.t=a;
a=null;
b=null;

在這里插入圖片描述
這倆對象不能再使用也釋放不了

4.1.2可達性分析

在寫代碼的時候會定義很多變量,就可以從這些變量作為起點開始遍歷,所謂的遍歷就是會沿著這些變量的引用類型成員再京一部訪問,所有能被訪問到的自然不是垃圾
在這里插入圖片描述

4.2垃圾釋放

4.2.1標記釋放

最直接的方法就是把標記為垃圾的直接釋放掉:但是這樣會生成很多內存碎片,后續如果有類對象再申請空間可能就不夠用
在這里插入圖片描述

4.2.2復制算法

把一個空間分成兩半,假設數據存放于左半邊那么把不是垃圾的數據全部賦值到右半再講左半數據全部釋放掉。
灰色為垃圾標記,數字為數據
在這里插入圖片描述
在這里插入圖片描述
這樣總的內存空間減少,且復制的開銷也很大。

4.2.3標記整理

在這里插入圖片描述
在這里插入圖片描述
該方案是把所有的數據依次向前搬運,覆蓋掉垃圾區,再把剩下的垃圾進行釋放。
雖然這樣能解決內存碎片的問題,但搬運的內存開銷很大

4.2.4分代回收

JVM中有專門的線程負責周期性掃描,一個對象如果被掃描了一次,年齡就+1,JVM會根據對象年齡的差異,把整個堆分成2部分,新生代,老年代。
在這里插入圖片描述
1)當代碼中new出一個新的對象,這個對象就是被創建在伊甸區,伊甸區的對象大部分都活不夠第一輪,生命周期非常短
2)第一輪GC掃描完成以后,少數伊甸區幸存的對象會通過復制算法拷貝到生存區,在后續GC掃描的時候不僅會掃描伊甸區還會掃描生存區的對象,生存區的大多數對象也會在掃描中被標記為垃圾,少數存活,就會繼續通過復制算法拷貝到另一個生存區,每次經歷一輪GC年齡就+1.
3)如果這個對象在生存區中經歷了若干輪依然在,那么就會把這個對象拷貝到老年區。
4)老年代的對象也會被GC掃描只是頻次大大減小
5)對象在老年代結束以后就會釋放內存。

5.總結

本篇文章主要JVM內存區域劃分,類加載,雙親委派模型,垃圾識別,引用計數,可達性分析,垃圾釋放,分代回收等等。

下期預告:MySQL

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

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

相關文章

【智能優化算法】粒子群優化算法(PSO)【附python實現代碼】

寫在前面: 首先感謝兄弟們的訂閱,讓我有創作的動力,在創作過程我會盡最大能力,保證作品的質量,如果有問題,可以私信我,讓我們攜手共進,共創輝煌。 路雖遠,行則將至&#…

【軟件設計師】下午題總結-數據流圖、數據庫、統一建模語言

下午題總結 1 試題一1.1 結構化語言 2 試題二弱實體增加權限增加實體間聯系和聯系的類型 3 試題三3.1 UML關系例子 3.2 例子(2016上半年)3.3 設計類分類3.3.1 接口類3.3.2 控制類3.3.3 實體類 3.4 簡答題3.4.1 簡要說明選擇候選類的原則3.4.2 某個類必須…

Kafka SSL認證

證書生成 在kafka安裝目錄下/certificates生成keystore和trust文件,在其中一臺機器聲生成證書,然后將 生成的server.keystore.jks和server.truststore.jks文件拷貝其他broker節點上去即可 1.生成keystore [rootm1 certificates]# keytool -keystore se…

Mantine UI:簡潔、靈活的 React UI 庫

介紹 Mantine UI Mantine UI 是一個由 React 驅動的現代 UI 庫,旨在簡化開發人員構建用戶界面的過程。它提供了一系列經過優化和可訪問的組件,適用于各種項目,從簡單的網站到復雜的應用程序。Mantine UI 的特點包括: 可定制性&a…

Android-okhttp調接口傳參簡單舉例

步驟1:在主線程中創建thread調接口 new Thread(new Runnable() {Overridepublic void run() {getServiceList();}}).start();步驟2:okhttp調接口 private void getServiceList(){Message msg new Message();try{OkHttpClient okHttpClient new OkHttp…

【網絡安全】網絡安全協議的重要性

一.網絡安全 1.什么是網絡安全 網絡安全(Cyber Security)是指網絡系統的硬件、軟件及其系統中的數據受到保護,不因偶然的或者惡意的原因而遭受到破壞、更改、泄露,系統連續可靠正常地運行,網絡服務不中斷。 2.網絡安…

WPF密碼輸入框明文掩碼切換

1&#xff0c;效果 2&#xff0c;代碼&#xff1a; WPF的PasswordBox不能像Winform中的PasswordBox那樣&#xff0c;通過PasswordBox.PasswordChar(char)0顯示明文。所以這里使用無外觀控件構筑掩碼明文切換。 無外觀控件遵守Themes/Generic.xaml文件配置. <ResourceDicti…

視覺檢測實戰項目——九點標定

本文介紹九點標定方法 已知 9 個點的圖像坐標和對應的機械坐標,直接計算轉換矩陣,核心原理即最小二乘擬合 {??′=????+????+????′=??′??+??′??+??′ [??1??11??2??21?????9??91][????′????′????′]=[??1′??…

[Linux]磁盤管理

一.Linux磁盤管理的原理 磁盤分區與Linux的目錄是借助"掛載機制"鏈接的&#xff0c;將一個分區與一個目錄連接起來。訪問目錄&#xff0c;相當于訪問某塊分區 lsblk命令: lsblk命令可以查看磁盤分區&#xff0c;以及每個分區所掛載的目錄 lsblk -f 可以查看更細節的…

山東大學軟件學院項目實訓-創新實訓-基于大模型的旅游平臺(十九)- JUC(5)

synchronized優化原理 輕量級鎖 如果一個對象有多個線程訪問&#xff0c;但多線程訪問的時間是錯開的&#xff08;沒有競爭&#xff09;&#xff0c;可以用輕量級鎖優化 Slf4j(topic "c.ExerciseTransfer")public class Test {?static final Object obj new Obj…

關于陽光雨露外派聯想的面試感想

最近在找工作&#xff0c;接到了一個陽光雨露外派聯想的面試邀請。說實在的一開始就有不對勁的感覺。想必這就是大廠的自信吧&#xff0c;上就問能不能現場面試&#xff0c;然后直接發面試邀請。這時候我倒是沒覺得有啥問題。 然后今天就去面試去了&#xff0c;住的比較偏&…

【研發日記】【策劃向】(一)游戲策劃其實就是一道加減法題

文章目錄 序設計的過程其實是控制自己欲望的過程我海納百川&#xff0c;你要不要看看&#xff1f;我跟別人不一樣&#xff01;我的人設就是沒有人設&#xff0c;或者說任何人設都是我的人設 記 序 不知不覺進入這個行業幾年了&#xff0c;也經歷了獨立開發和團隊開發的過程。在…

欣賞倪詩韻青桐斷紋古琴很罕見:萬中無一。

欣賞倪詩韻青桐斷紋古琴很罕見&#xff1a;萬中無一。龍池側簽海門倪詩韻制&#xff0c;帶收藏證書此琴斷紋優美如江面波光粼粼&#xff0c;為流水蛇腹斷&#xff0c;是倪老師作品精品中的精品。細心的朋友可以看出倪老師在這張琴上題字非常小心認真。用一個詞來形容——萬中無…

CPython3.7.9源碼學習一:C語言基礎、整數對象

C 語言基礎 結構體 // struct(關鍵字) 名稱 {結構體成員};// 定義結構體 struct Student { char name[50]; int age; float score; };// 初始化 結構體變量 struct Student stu1; strcpy(stu1.name, "張三"); stu1.age 20; stu1.score 90.5;// 初始化 …

Spring Boot線程池的 使用

一.異步方法 1.啟動類加EnableAsync注解 2.在需要異步執行的方法上添加Async注解 3.直接調用 結論&#xff1a;異步方法是通過SpringBoot中自動注入的線程池任務執行器實現的 二.自定義線程池 1.創建線程的配置類 2.使用Async注解時指定名稱 3.結論 手動注入多個線程池任務執…

Java 18新特性

Java 18引入了一系列新的特性和改進&#xff0c;這些更新覆蓋了從基本語言構造到更高級別的API等多個方面。以下是一些Java 18的主要新特性&#xff1a; 模式匹配增強&#xff1a;Java 18改進了模式匹配功能&#xff0c;使其更加強大和易于使用。開發人員可以使用模式匹配來簡…

Linux echo命令(在終端輸出文本)

文章目錄 Linux Echo命令深度解析簡介命令語法常見選項- -n&#xff1a;不輸出行尾的換行符&#xff0c;這意味著輸出后不會換到下一行。- -e&#xff1a;啟用反斜杠轉義的解釋&#xff0c;允許使用特殊字符。- -E&#xff1a;禁用反斜杠轉義的解釋&#xff08;默認選項&#x…

基于地理坐標的高階幾何編輯工具算法(2)——相交面裁剪

文章目錄 工具步驟應用場景算法輸入算法輸出算法示意圖算法原理后處理 工具步驟 選中一個需要裁剪的面&#xff0c;點擊“相交面裁剪”工具&#xff0c;多選裁剪模板面&#xff0c;空格執行。 應用場景 常用于基于遙感影像的建筑物幾何面編輯。 算法輸入 一個待裁剪的面&a…

sqlserver的查詢(三)

目錄 10. group by(分組) 11. having(對分組后的信息過濾) 可能從這里開始&#xff0c;執行順序越來越顯得重要了&#xff01;&#xff01;&#xff01; 10. group by(分組) 這個查詢相比前面會有一些困難&#xff1b; 格式&#xff1a;group by 字段的集合&#xff1b; 功…

Java進階學習筆記8——單繼承、Object類、方法重寫

Java 是單繼承的&#xff0c;Java中的類不支持多繼承&#xff0c;但是支持多層繼承。 Object類是所有類的父類。 Java不支持多類繼承&#xff1a; Java支持多層繼承&#xff1a; 反證法&#xff1a; Object類&#xff1a; Object類是java所有類的祖宗類&#xff0c;我們寫的任…