国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

JVM基礎(chǔ)知識(shí)(內(nèi)存區(qū)域劃分,類加載,GC垃圾回收)

這篇具有很好參考價(jià)值的文章主要介紹了JVM基礎(chǔ)知識(shí)(內(nèi)存區(qū)域劃分,類加載,GC垃圾回收)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

目錄

內(nèi)存區(qū)域劃分

JVM中的棧

JVM中的堆

程序計(jì)數(shù)器

方法區(qū)(元數(shù)據(jù)區(qū))

給一段代碼,某個(gè)變量在哪個(gè)區(qū)域上?

類加載

類加載時(shí)機(jī)

雙親委派模型

GC 垃圾回收機(jī)制

GC 實(shí)際工作過程

1.找到垃圾/判定垃圾

1.可達(dá)性分析(Java中的做法)

2.引用計(jì)數(shù)

2.清理垃圾

1.標(biāo)記清除

2.復(fù)制算法

3.標(biāo)記整理

分代回收(復(fù)制算法+標(biāo)記整理)


內(nèi)存區(qū)域劃分

如果內(nèi)存區(qū)域只有一塊,不太方便,為了更加方便使用,就把整個(gè)空間隔成很多區(qū)域,每一個(gè)區(qū)域都有不同的作用
JVM,在啟動(dòng)的時(shí)候,會(huì)申請(qǐng)一整個(gè)很大的區(qū)域,JVM 是一個(gè)應(yīng)用程序,從操作系統(tǒng)里申請(qǐng)內(nèi)存,JVM把整個(gè)空間分層幾個(gè)部分,每個(gè)部分各自有不同的功能作用
每一個(gè)Java進(jìn)程都包含一個(gè)JVM

JVM基礎(chǔ)知識(shí)(內(nèi)存區(qū)域劃分,類加載,GC垃圾回收),jvm

JVM中的棧

JVM中的棧不是數(shù)據(jù)結(jié)構(gòu)中的棧,是JVM中的一個(gè)特定空間,對(duì)于 JVM 虛擬機(jī),這里存儲(chǔ)是 方法(我們自己寫的java代碼中的方法) 之間的調(diào)用關(guān)系.對(duì)于 本地方法棧,存儲(chǔ)的是JVM內(nèi)部方法的調(diào)用關(guān)系

整個(gè)??臻g內(nèi)部,可以認(rèn)為包含很多元素,每個(gè)元素表示一個(gè)方法. 這里的每個(gè)元素,稱為一個(gè)"棧幀",這一個(gè)棧幀里,會(huì)包含這個(gè)方法的 入口地址,方法的參數(shù)是什么,返回地址是什么,局部變量等

數(shù)據(jù)結(jié)構(gòu)的棧,是一個(gè)通用的更廣泛的概念,是后進(jìn)先出的數(shù)據(jù)結(jié)構(gòu),此處的JVM中的棧,特指JVM上的一塊內(nèi)存空間,由于函數(shù)調(diào)用,也是有后進(jìn)先出的特點(diǎn)

JVM中虛擬機(jī)中的棧,有很多,每一個(gè)線程都有一個(gè)屬于自己的棧,每一個(gè)棧都有很多的棧幀,調(diào)用一個(gè)方法會(huì)創(chuàng)建棧幀,方法結(jié)束,就會(huì)銷毀這個(gè)棧幀

JVM基礎(chǔ)知識(shí)(內(nèi)存區(qū)域劃分,類加載,GC垃圾回收),jvm

JVM中的堆

堆是整個(gè) JVM 空間最大的區(qū)域,new 出來的對(duì)象(引用類型),都是在堆上.因此類的成員變量也在堆上.
堆是一個(gè)進(jìn)程只有一份,一個(gè)進(jìn)程中的多個(gè)線程共用一份堆.棧是一個(gè)線程有一個(gè)棧,一個(gè)進(jìn)程有N個(gè)棧
堆的生命周期比較長,堆上面的方法執(zhí)行結(jié)束默認(rèn)不自動(dòng)釋放空間,而棧上面的方法會(huì)隨著方法執(zhí)行結(jié)束,自動(dòng)釋放空間

程序計(jì)數(shù)器

記錄當(dāng)前線程執(zhí)行到哪個(gè)指令,每個(gè)線程都獨(dú)有一份程序計(jì)數(shù)器

方法區(qū)(元數(shù)據(jù)區(qū))

方法區(qū)每個(gè)進(jìn)程只有一個(gè),多個(gè)線程共用一份,? 類對(duì)象,常量池,靜態(tài)成員(static)都在方法區(qū)

給一段代碼,某個(gè)變量在哪個(gè)區(qū)域上?

原則
1.局部變量在 棧 上
2.普通成員變量在 堆 上
3.靜態(tài)成員變量在 方法區(qū)/元數(shù)據(jù)區(qū) 上

類加載

類加載: 類加載就是 .class文件,從文件(硬盤)被加載到內(nèi)存中(方法區(qū)/元數(shù)據(jù)區(qū))這樣的過程

JVM基礎(chǔ)知識(shí)(內(nèi)存區(qū)域劃分,類加載,GC垃圾回收),jvm

加載: 把.class文件找到,打開文件,讀文件,把文件內(nèi)容讀到內(nèi)存中,最終得到類對(duì)象
驗(yàn)證: 檢查.class文件格式是否正確?
準(zhǔn)備: 給類對(duì)象分配一個(gè)內(nèi)存空間(在方法區(qū)/元數(shù)據(jù)區(qū)占個(gè)位置),會(huì)使靜態(tài)成員被設(shè)置成0值
解析: 初始化字符串常量,把符號(hào)引用轉(zhuǎn)換為直接引用
初始化: 調(diào)用構(gòu)造方法,進(jìn)行成員初始化,執(zhí)行代碼塊,靜態(tài)代碼塊,加載父類...? ? ??

類加載時(shí)機(jī)

java程序運(yùn)行,不是把所有的類都加載了,而是真正用到了才加載(懶漢模式),一旦加載過后,后續(xù)再使用就不必重復(fù)加載了

1.構(gòu)造類的實(shí)例
2.調(diào)用這個(gè)類的 靜態(tài)方法/使用靜態(tài)屬性
3.加載子類,就會(huì)先加載父類

雙親委派模型

雙親委派模型,描述的是 加載過程 找.class文件,基本過程

JVM默認(rèn)提供了 三個(gè) 類加載器

BootstrapClassLoader:? 負(fù)責(zé)加載標(biāo)準(zhǔn)庫中的類(java規(guī)范)

ExtensionClassLoader:? 負(fù)責(zé)加載JVM擴(kuò)展中的類(規(guī)范之外)

ApplicationClassLoader: 負(fù)責(zé)加載用戶提供的第三方庫/用戶項(xiàng)目代碼 中的類

上述三個(gè)類存在父子關(guān)系,BootstrapClassLoader是ExtensionClassLoader的父類,ExtensionClassLoader是ApplicationClassLoader的父類

加載一個(gè)類的時(shí)候是先從ApplicationClassLoader開始的,但是 ApplicationClassLoader會(huì)把加載任務(wù),交給父親,讓父親去執(zhí)行.于是ExtensionClassLoader要去加載,但是ExtensionClassLoader也會(huì)委托給自己的父親,于是BootstrapClassLoader就要去加載了,BootstrapClassLoader也想委托給自己的父類,可以它沒有父類,因此就由自己加載,此時(shí) Bootstrap就會(huì)搜索自己負(fù)責(zé)的標(biāo)準(zhǔn)庫目錄的相關(guān)的類,如果找到就加載,如果沒找到,就由子類加載器進(jìn)行加載..? ExtensionClassLoader 真正搜索擴(kuò)展庫相關(guān)的目錄,如果找到就加載,如果沒找到就由子類加載器加載.? ApplicationClassLoader,加載器進(jìn)行加載(由于當(dāng)前沒有子類,如果沒有找到,就會(huì)拋出 類找不到 這樣的異常)

GC 垃圾回收機(jī)制

垃圾指的是不再使用的內(nèi)存,垃圾回收,就是把不用的內(nèi)存幫我們自動(dòng)釋放掉了. 而GC 就是一種主流的垃圾回收機(jī)制,GC垃圾回收機(jī)制 主要是針對(duì) 堆 里面的空間進(jìn)行釋放的, GC 是以"對(duì)象" 為基本單位,進(jìn)行回收

GC 實(shí)際工作過程

1.找到垃圾/判定垃圾

哪個(gè)對(duì)象是垃圾,哪個(gè)對(duì)象不是垃圾,哪個(gè)對(duì)象以后可能還要使用,哪個(gè)對(duì)象后面不用了,關(guān)鍵思路是:看這個(gè)對(duì)象,有沒有別的引用指向它(java中,使用對(duì)象只能通過引用來使用,如果一個(gè)對(duì)象沒有引用指向,那么它一定不被使用)

具體如何判斷對(duì)象是否有引用指向

1.可達(dá)性分析(Java中的做法)

Java 中的對(duì)象,都是通過引用來指向并訪問的,經(jīng)常是,一個(gè)引用指向一個(gè)對(duì)象,這個(gè)對(duì)象里的成員,又指向別的對(duì)象,比如鏈表,二叉樹
整個(gè)Java中所有的對(duì)象,通過鏈表/樹結(jié)構(gòu),整體串起來,可達(dá)性分析 就是把所有這些對(duì)象被組織的結(jié)構(gòu)稱為樹,從樹根節(jié)點(diǎn)出發(fā),所有能被訪問到的對(duì)象,標(biāo)記成 "可達(dá)",不能訪問到的,就是"不可達(dá)"
因此,通過上述標(biāo)記JVM就可以知道所有可達(dá)的對(duì)象,剩下的不可達(dá)對(duì)象,就視為垃圾 進(jìn)行回收

2.引用計(jì)數(shù)

給每個(gè)對(duì)象分配一個(gè)計(jì)數(shù)器(整數(shù)),每有一個(gè)引用指向該對(duì)象,計(jì)數(shù)器就+1,每次該引用被銷毀 計(jì)數(shù)器就-1,引用計(jì)數(shù)為0時(shí),此時(shí)這個(gè)對(duì)象就可以認(rèn)為是垃圾了

2.清理垃圾

1.標(biāo)記清除

直接把被標(biāo)記的垃圾清除掉,缺點(diǎn): 被釋放的空間是閑散,零散,不連續(xù),而我們申請(qǐng)內(nèi)存需要連續(xù)的內(nèi)存空間

2.復(fù)制算法

把不是垃圾的對(duì)象,復(fù)制到另一半,然后把剛剛有垃圾的一半整個(gè)空間刪除掉.解決了內(nèi)存碎片的問題
缺點(diǎn),空間利用率低,如果要是垃圾少,有效對(duì)象多,復(fù)制成本大

3.標(biāo)記整理

類似順序表刪除中間元素,把是垃圾的元素用不是垃圾的元素給填掉(元素搬運(yùn)),再釋放空間

分代回收(復(fù)制算法+標(biāo)記整理)

根據(jù)不同的場(chǎng)景,使用不同的算法
分代: 基于經(jīng)驗(yàn)規(guī)律,根據(jù)生命周期的長短,分別使用不同的算法
給對(duì)象引入一個(gè) 年齡 的概念,單位是 熬過GC垃圾回收的輪次,把年齡小的對(duì)象使用復(fù)制算法刪除(年齡小的對(duì)象中,可能是垃圾的比較多),把年齡大的對(duì)象使用標(biāo)記整理刪除(老年代對(duì)象可能是垃圾較少)文章來源地址http://www.zghlxwxcb.cn/news/detail-732246.html

到了這里,關(guān)于JVM基礎(chǔ)知識(shí)(內(nèi)存區(qū)域劃分,類加載,GC垃圾回收)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • JVM零基礎(chǔ)到高級(jí)實(shí)戰(zhàn)之Java內(nèi)存區(qū)域本地方法棧

    JVM零基礎(chǔ)到高級(jí)實(shí)戰(zhàn)之Java內(nèi)存區(qū)域本地方法棧 JVM零基礎(chǔ)到高級(jí)實(shí)戰(zhàn)之Java內(nèi)存區(qū)域本地方法棧 本地方法棧是什么? 用于作用域本地方法執(zhí)行的一塊Java內(nèi)存區(qū)域 為什么要有本地方法棧? 與Java虛擬機(jī)棧相同,每個(gè)方法在執(zhí)行的同時(shí)都會(huì)創(chuàng)建一個(gè)棧幀(Stack Framel)用于存儲(chǔ)局部

    2024年02月09日
    瀏覽(13)
  • JVM-基礎(chǔ)知識(shí)

    JVM-基礎(chǔ)知識(shí)

    JVM基礎(chǔ)知識(shí) JVM結(jié)構(gòu)圖 字節(jié)碼文件 Java虛擬機(jī)不和包括Java在內(nèi)的任何語言綁定,它只與字節(jié)碼文件這種特定的二進(jìn)制文件格式所關(guān)聯(lián). Class文件結(jié)構(gòu)不僅僅是JVM的執(zhí)行入口,更是Java生態(tài)圈的基礎(chǔ)和核心. 字節(jié)碼文件內(nèi)容是什么 字節(jié)碼是一種二進(jìn)制的類文件,他的內(nèi)容是JVM指令,而不

    2024年02月07日
    瀏覽(21)
  • 《JavaEE初階》JVM基礎(chǔ)知識(shí)

    《JavaEE初階》JVM基礎(chǔ)知識(shí)

    本章主要介紹JVM中比較重要的三個(gè)內(nèi)容: JVM內(nèi)存區(qū)域劃分 JVM類加載機(jī)制 JVM垃圾回收機(jī)制 當(dāng)我們創(chuàng)建一個(gè)java進(jìn)程時(shí),啟動(dòng)時(shí)會(huì)向操作系統(tǒng)申請(qǐng)一塊內(nèi)存,JVM會(huì)將這塊內(nèi)存劃分為幾個(gè)區(qū)域: 堆 棧 程序計(jì)數(shù)器 方法區(qū) 堆: 堆上主要存放的是new的對(duì)象,是最重要的區(qū)域,也是內(nèi)存劃分最多

    2024年02月09日
    瀏覽(59)
  • JVM-環(huán)境準(zhǔn)備&性能指標(biāo)&基礎(chǔ)知識(shí)

    環(huán)境準(zhǔn)備性能指標(biāo)基礎(chǔ)知識(shí) 環(huán)境準(zhǔn)備 JDK — 工具 JDK(Java Development Kit) 是用于開發(fā) Java 應(yīng)用程序的軟件開發(fā)工具集合,包括了 Java 運(yùn)行時(shí)的環(huán)境(JRE)、解釋器(Java)、編譯器(javac)、Java 歸檔(jar)、文檔生成器(Javadoc)等工具。簡單的說我們要開發(fā) Java 程序,就需要

    2024年02月07日
    瀏覽(21)
  • JVM,關(guān)于JVM基礎(chǔ)的知識(shí),你確定不了解一下嗎?

    JVM,關(guān)于JVM基礎(chǔ)的知識(shí),你確定不了解一下嗎?

    目錄 一.JVM的概念 什么是JVM? 二.JVM的運(yùn)行流程 1.class文件如何被JVM加載并運(yùn)行 2.JVM運(yùn)行時(shí)數(shù)據(jù)包括哪些區(qū)域(M) 三.類加載的過程(M) 四.雙親委派模型 1.雙親委派模型分析 2.JAVA中有哪些類加載器(M) 五.垃圾回收機(jī)制 1.死亡對(duì)象的標(biāo)識(shí) ①引用計(jì)數(shù)算法 ②可達(dá)性分析算法

    2024年02月02日
    瀏覽(21)
  • Java基礎(chǔ)??贾R(shí)點(diǎn)(基礎(chǔ)、集合、異常、JVM)

    Java基礎(chǔ)??贾R(shí)點(diǎn)(基礎(chǔ)、集合、異常、JVM)

    作者: 逍遙Sean 簡介:一個(gè)主修Java的Web網(wǎng)站游戲服務(wù)器后端開發(fā)者 主頁:https://blog.csdn.net/Ureliable 覺得博主文章不錯(cuò)的話,可以三連支持一下~ 如有需要我的支持,請(qǐng)私信或評(píng)論留言! 本文收集Java核心的面試??贾R(shí)點(diǎn),碼起面試之前復(fù)習(xí)?。。?JDK(Java SE Development Kit) ,

    2024年02月07日
    瀏覽(37)
  • jvm中類和對(duì)象定義存儲(chǔ)基礎(chǔ)知識(shí)

    jvm中類和對(duì)象定義存儲(chǔ)基礎(chǔ)知識(shí)

    Class文件結(jié)構(gòu)主要有兩種數(shù)據(jù)結(jié)構(gòu): 無符號(hào)數(shù)和表 ? 無符號(hào)數(shù) :用來表述數(shù)字,索引引用、數(shù)量值以及字符串等,比如 圖1中類型為u1,u2,u4,u8分別代表1個(gè)字節(jié),2個(gè)字節(jié),4個(gè)字節(jié),8個(gè)字節(jié)的無符號(hào)數(shù) ? 表 :表是有由多個(gè)無符號(hào)數(shù)以及其它的表組成的復(fù)合結(jié)構(gòu),比如圖1中類

    2024年02月08日
    瀏覽(28)
  • JAVA后端開發(fā)面試基礎(chǔ)知識(shí)(一)——JVM

    Class loader(類裝載) 根據(jù)給定的全限定名類名(如: java.lang.Object)來裝載class文件到 Runtime data area中的method area。 Execution engine(執(zhí)行引擎) 執(zhí)行classes中的指令。 Native Interface(本地接口) 與native libraries交互,是其它編程語言交互的接口。 Runtime data area(運(yùn)行時(shí)數(shù)據(jù)區(qū)域) 這就是我們常說

    2024年03月10日
    瀏覽(22)
  • 內(nèi)存管理框架 --- 基礎(chǔ)知識(shí)

    早期的計(jì)算機(jī), 程序是直接運(yùn)行在物理內(nèi)存上 。也就是程序在運(yùn)行的過程中,直接訪問的是物理地址。 如果這個(gè)系統(tǒng)只運(yùn)行一個(gè)程序,只要這個(gè)程序所需的內(nèi)存不要超過該機(jī)器的物理內(nèi)存就不會(huì)出現(xiàn)問題,也就不需要考慮內(nèi)存管理,反正就一個(gè)程序,就這么點(diǎn)內(nèi)存,夠不夠

    2024年02月11日
    瀏覽(22)
  • 第三章 內(nèi)存管理 一、內(nèi)存的基礎(chǔ)知識(shí)

    第三章 內(nèi)存管理 一、內(nèi)存的基礎(chǔ)知識(shí)

    目錄 一、什么是內(nèi)存 二、有何作用? 三、常用數(shù)量單位 四、指令的工作原理 五、裝入方式 1、絕對(duì)裝入 2、可重定位裝入(靜態(tài)重定位) 3、動(dòng)態(tài)運(yùn)行時(shí)裝入(動(dòng)態(tài)重定位) 六、從寫程序到程序運(yùn)行 七、鏈接的三種方式 1、靜態(tài)鏈接 2、裝入時(shí)動(dòng)態(tài)鏈接 3、運(yùn)行時(shí)動(dòng)態(tài)鏈接

    2024年02月07日
    瀏覽(29)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包