久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

深入淺出Java中JVM內(nèi)存管理

 IT編程技能提升 2019-03-29

Java崗位面試,JVM是對程序員基本功考察,通常會問你對JVM了解嗎? 可以分幾部分回答這個(gè)問題,首先JVM內(nèi)存劃分 | JVM垃圾回收的含義 | 有哪些GC算法 以及年輕代和老年代各自特點(diǎn)等等

1) JVM內(nèi)存劃分:

① 方法區(qū) (線程共享) 常量 靜態(tài)變量 JIT(即時(shí)編譯器)編譯后代碼也在方法區(qū)存放

② 堆內(nèi)存(線程共享) 垃圾回收的主要場地

③ 程序計(jì)數(shù)器 當(dāng)前線程執(zhí)行的字節(jié)碼的位置指示器

④ Java虛擬機(jī)棧(棧內(nèi)存) :保存局部變量,基本數(shù)據(jù)類型以及堆內(nèi)存中對象的引用變量

⑤ 本地方法棧 (C棧):為JVM提供使用native方法的服務(wù)

通過這幅圖了解一下

深入淺出Java中JVM內(nèi)存管理

JDK 1.8同JDK 1.7 ,最大的區(qū)別是:元數(shù)據(jù)取代了永久代.元空間的本質(zhì)和永久代類似,都是對JVM規(guī)范中的方法區(qū)的實(shí)現(xiàn).其元空間和永久代之間的最大區(qū)別在于:元數(shù)據(jù)空間不在虛擬機(jī)中,而是在本地內(nèi)存中

詳細(xì)了解一下各個(gè)部分

01)程序計(jì)數(shù)器(PC寄存器)

程序計(jì)數(shù)器的定義: 程序計(jì)數(shù)器是一塊較小的內(nèi)存空間,是當(dāng)前線程正在執(zhí)行的哪一條字節(jié)碼指令的地址,若當(dāng)前線程正在執(zhí)行的是一個(gè)本地方法,那么此時(shí)程序計(jì)數(shù)器為Undefined

程序計(jì)數(shù)器的作用:

  • 字節(jié)碼解釋器通過改變程序計(jì)數(shù)器來依次獲取指令,從而實(shí)現(xiàn)代碼的流程的控制

  • 在在多線程情況下,程序計(jì)數(shù)器記錄的是當(dāng)前線程執(zhí)行的執(zhí)行的位置,從而當(dāng)線程切換回來時(shí),就知道上次線程執(zhí)行到哪了

程序計(jì)數(shù)器的特點(diǎn)

  • 是一塊較小的內(nèi)存空間

  • 線程私有,每個(gè)線程都有自己的程序計(jì)數(shù)器

  • 生命周期:隨著線程的創(chuàng)建而創(chuàng)建,隨著線程的銷毀而銷毀

  • 是一個(gè)唯一不會出現(xiàn)的OutOfMemoryError的內(nèi)存區(qū)域

02)Java虛擬機(jī)棧

定義: 描述Java方法運(yùn)行過程的內(nèi)存模型

Java虛擬機(jī)棧會為每一個(gè)即將運(yùn)行的Java方法創(chuàng)建一塊叫做"棧幀"的區(qū)域,用于存放該方法運(yùn)行過程中的一些信息,如 局部變量表 /操作數(shù)棧 /動(dòng)態(tài)鏈接 /方法出口信息 .............

深入淺出Java中JVM內(nèi)存管理

壓棧出棧過程:

當(dāng)方法運(yùn)行過程中需要?jiǎng)?chuàng)建局部變量時(shí),就將局部變量的值存入棧幀的局部變量表中

Java虛擬機(jī)棧的棧頂是當(dāng)前正在執(zhí)行的活動(dòng)棧,也就是當(dāng)前正在執(zhí)行的方法,PC寄存器也會指向這個(gè)地址,只有這個(gè)活動(dòng)的棧幀的本地變量可以被操作數(shù)棧操作,當(dāng)前這個(gè)棧幀中調(diào)用另一個(gè)方法,與之對應(yīng)的額棧幀又會被創(chuàng)建,新創(chuàng)建的棧幀壓入棧頂,變成當(dāng)前的活動(dòng)棧幀,方法結(jié)束后,當(dāng)前棧幀的返回值變成新的活動(dòng)棧幀的中的操作數(shù)棧的一個(gè)操作數(shù),如果沒有返回值,那么新的活動(dòng)棧幀中操作數(shù)棧的操作數(shù)沒有變化

由于Java虛擬機(jī)棧是線程對應(yīng)的,數(shù)據(jù)不是共享的,因此不用關(guān)心數(shù)據(jù)一致性問題,也不會存在同步鎖的問題

特點(diǎn)

  • 局部變量表隨著棧幀的創(chuàng)建而創(chuàng)建,他的大小在編譯時(shí)確定,創(chuàng)建時(shí)只需分配事先規(guī)定的大小即可,在方法運(yùn)行的過程中,局部變化表的大小不會發(fā)生變化

  • Java虛擬機(jī)棧會出現(xiàn)兩種異常:StackOverFlowError和OutOfMemoryError

  • StackOverFlowError若Java虛擬機(jī)棧的大小不允許動(dòng)態(tài)擴(kuò)展,那么當(dāng)前線程請求的棧的深度超過當(dāng)前的Java虛擬機(jī)棧的最大深度是,就會拋出此異常

  • OutOFMemoryError,若允許動(dòng)態(tài)擴(kuò)展,那么當(dāng)前線程的請求的棧內(nèi)存用完了,無法再動(dòng)態(tài)擴(kuò)展時(shí),拋出此異常

  • Java虛擬機(jī)棧也是線程私有,隨著線程創(chuàng)建而創(chuàng)建,隨著線程的結(jié)束而銷毀

03)本地方法棧(C棧)

定義: 是為了JVM運(yùn)行native方法準(zhǔn)備的空間,由于很多native方法都是用C語言實(shí)現(xiàn)的,所以通常又叫C棧,它與Java虛擬機(jī)棧實(shí)現(xiàn)的功能類似,只不過本地方法棧描述本地方法運(yùn)行過程的內(nèi)存模型

棧幀變化過程:

本地方法被執(zhí)行時(shí),在本地方法棧也會創(chuàng)建一塊棧幀,用于存放該方法的局部變量表 /操作數(shù)棧 /動(dòng)態(tài)鏈接 /方法出口等信息; 方法結(jié)束后,相應(yīng)的棧幀也會出棧,并釋放內(nèi)存空間.也會拋出StackOverFlowError和OutOfMemoryError異常

04) 堆

定義: 堆是用來對象的內(nèi)存空間,幾乎所有的對象都存儲在堆中

特點(diǎn):

  • 線程共享,整個(gè)Java虛擬機(jī)只有一個(gè)堆,所有線程都訪問同一個(gè)堆.

  • 在虛擬機(jī)啟動(dòng)時(shí)創(chuàng)建

  • 是垃圾回收的主要場地

  • 進(jìn)一步可分為:新生代(Eden區(qū) From Survior To Surviror) 老年代

不同的區(qū)域存放的不同生命周期的對象,這樣可以根據(jù)不同區(qū)域使用不同的垃圾回收算法,更具有針對性. 堆的大小也可以固定也可以擴(kuò)展,對于主流的虛擬機(jī),堆大小可擴(kuò)展的,因此當(dāng)線程請求分配的內(nèi)存,但堆已滿,且內(nèi)存已無法再擴(kuò)展,就拋出OutOfMemoryError異常

05)方法區(qū)

定義: Java虛擬機(jī)規(guī)范中定義方法區(qū)是堆的一個(gè)邏輯部分,方法區(qū)存放以下信息 已被虛擬機(jī)加載的類信息 /常量 /靜態(tài)變量 /即時(shí)編譯后代碼

特點(diǎn):

  • 線程共享.方法區(qū)是堆的一個(gè)邏輯部分,因此和堆一樣,都是線程共享,整個(gè)虛擬機(jī)中只有一個(gè)方法區(qū)

  • 永久代 方法區(qū)中的信息一般需要長期存在,而且它又是堆的邏輯分區(qū),因此用堆的劃分方法,把方法區(qū)稱為"永久代"

  • 內(nèi)存回收的效率低.方法區(qū)中的信息一般需要長期存在,回收一遍只有少量信息無效.主要回收的目標(biāo)是: 對常量池的回收;對類型的卸載

  • Java虛擬機(jī)規(guī)范l對方法區(qū)的要求比較寬松,和堆一樣,允許固定大小.也允許動(dòng)態(tài)擴(kuò)展,還允許不實(shí)現(xiàn)垃圾回收

運(yùn)行時(shí)常量池:

方法區(qū)中存放:類信息 常量 靜態(tài)變量 即時(shí)編譯器變編譯后代碼.常量就存放在運(yùn)行時(shí)常量池中.當(dāng)類被Java虛擬機(jī)加載后,.class文件中的常量就存在方法區(qū)的運(yùn)行常量池,而且在運(yùn)行期間,可以向常量池中添加新的常量,如String類的intern()方法就能在運(yùn)行期間向常量池中添加字符串常量

06) 直接內(nèi)存(堆外內(nèi)存)

直接內(nèi)存是除Java虛擬機(jī)之外的內(nèi)存,但有可能被Java使用

操作直接內(nèi)存:

在NIO中引入了一種基于通道和緩存的IO方式,他可以調(diào)用本地方法的直接分配Java虛擬機(jī)之外的內(nèi)存,然后通過一個(gè)存儲在堆中的DirectByteBuffer對象直接操作該內(nèi)存,而無需將外部內(nèi)存中數(shù)據(jù)復(fù)制到堆中再進(jìn)行操作,從而提高數(shù)據(jù)操作的效率,直接內(nèi)存的大小不受Java虛擬機(jī),也會拋出OutOfMemoryError異常

直接內(nèi)存和堆內(nèi)存比較

  • 直接內(nèi)存申請空間耗費(fèi)更高的性能

  • 直接內(nèi)存讀取IO的性能優(yōu)于普通的堆內(nèi)存

  • 直接內(nèi)存的作用鏈:本地IO-->直接內(nèi)存-->本地IO

  • 堆內(nèi)存的作用鏈:本地IO-->直接內(nèi)存-->非直接內(nèi)存-->直接內(nèi)存--->本地IO

服務(wù)器管理員在配置虛擬機(jī)參數(shù)時(shí),會根據(jù)實(shí)際內(nèi)存設(shè)置 -Xmx等參數(shù)信息,但經(jīng)常忽略直接內(nèi)存,使得各個(gè)內(nèi)存區(qū)域總和大于物理內(nèi)存,從而導(dǎo)致動(dòng)態(tài)擴(kuò)展時(shí)出現(xiàn)OutOFMemoryError

2)類似 -Xms -Xmn這些參數(shù)的含義

堆內(nèi)存分配

① : JVM初始分配的內(nèi)存由-Xms指定,默認(rèn)是物理內(nèi)存的1/64

②: JVM最大分配的內(nèi)存由-Xmx指定,默認(rèn)是物理內(nèi)存的1/4

③: 默認(rèn)空余堆內(nèi)存小于40%時(shí),JVM就會增加堆直到-Xmx的最大限制;空余堆內(nèi)存大于70%時(shí),JVM會減少堆直到-Xms的最小限制

④: 因此服務(wù)器一般設(shè)置-Xms -Xmx相等以避免在每次GC后調(diào)整堆大小. 對象的堆內(nèi)存由成為垃圾回收器的自動(dòng)內(nèi)存管理系統(tǒng)回收

非堆內(nèi)存分配:

①:JVM使用-XX:PermSize 設(shè)置非堆內(nèi)存的初始值,默認(rèn)物理內(nèi)存的1/64;

② :由XX:MaxPermSize設(shè)置設(shè)置最大非堆內(nèi)存的大小

③: -Xmn2G :設(shè)置年輕代的大小為2G

④ :-XX:SurvivorRatio ,設(shè)置年輕代中Eden區(qū)與Survivor區(qū)的比值

3)垃圾回收的算法有哪些?

① 引用計(jì)數(shù)法:原理是在此對象有個(gè)引用,即增加一個(gè)計(jì)數(shù),刪除一個(gè)引用則減少一個(gè)計(jì)數(shù).垃圾回收時(shí),只收集計(jì)數(shù)為0的對象.此算法的最致命的無法處理循環(huán)引用的問題

②: 標(biāo)記-清除 :此算法分兩個(gè)階段,第一階段從引用的根節(jié)點(diǎn)開始標(biāo)記所有被引用的對象,第二階段遍歷整個(gè)堆,把未標(biāo)記的對象清除,此算法需要暫停應(yīng)用,同時(shí)產(chǎn)生內(nèi)存碎片

③: 復(fù)制算法 此算法把內(nèi)存劃分為兩個(gè)相等的區(qū)域,每次只使用一個(gè)區(qū)域,垃圾回收時(shí),遍歷當(dāng)前使用的區(qū)域,把正在使用的對象復(fù)制到另一個(gè)區(qū)域中每次算法每次只處理正在使用的對象,因此復(fù)制的成本比較小,同時(shí)復(fù)制過去以后還能進(jìn)行相應(yīng)的內(nèi)存整理,不會出現(xiàn)"碎片問題",此算法的缺點(diǎn)也很明顯,需要兩倍的內(nèi)存空間

④: 標(biāo)記-整理:此算法結(jié)合了"標(biāo)記-清除"和:復(fù)制算法的兩個(gè)的優(yōu)點(diǎn),也是分兩個(gè)階段,第一個(gè)階段從根節(jié)點(diǎn)開始標(biāo)記所有被引用對象,第二階段遍歷整個(gè)堆,清除未標(biāo)記的對象并且把存活的對象"壓縮"到堆的其中一塊,按順序排放,,此算法避免"標(biāo)記-清除"的碎片問題,同時(shí)也避免"復(fù)制"的空間問題

4)root搜索算法中,哪些可以作為root?

  • 被啟動(dòng)類(bootstrap加載器)加載的類和創(chuàng)建的對象

  • JavaStack中引用的對象(棧內(nèi)存中引用的對象)

  • 方法區(qū)中靜態(tài)引用

越努力 越幸運(yùn),! 加油,!

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多