黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節(jié)點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學(xué)習(xí)攻略 編程技術(shù)分享,Java虛擬機內(nèi)存管理

編程技術(shù)分享,Java虛擬機內(nèi)存管理

更新時間:2020-07-21 11:22:31 來源:動力節(jié)點 瀏覽2411次

內(nèi)存模型

一說到內(nèi)存管理,首先需要了解它的內(nèi)存模型。

虛擬機的內(nèi)存模型在jdk1.8之后有了一些變化,我們分開來看,請看下圖:

編程技術(shù)分享,Java虛擬機內(nèi)存管理

由圖我們可以看出,jdk每個版本都會有新生代和老年代,唯一不同的是小于1.8的版本為永久代,而大于等于1.8的版本去掉了永久代,轉(zhuǎn)為元空間(Meta Space)。

永久代也就是存儲的數(shù)據(jù)區(qū)里面的方法區(qū),如果程序在運行中發(fā)生PermSpace溢出,則說明永久代內(nèi)存不夠,需要調(diào)整JVM參數(shù)增加永久代內(nèi)存空間。

jdk1.8以后出現(xiàn)了MetaSpace,它和永久代不同的是,它的內(nèi)存空間是動態(tài)擴展的,當(dāng)然我們也可以設(shè)置MaxMetadaSpace來設(shè)置最大元空間內(nèi)存數(shù)量,也就是在1.8以后設(shè)置PermSize是無效的。

本文主要講解jdk1.8以前得內(nèi)存管理機制

垃圾回收機制

在現(xiàn)代編程語言中,對垃圾回收算法主要有兩種方式:引用計數(shù)器和可達(dá)性分析。

引用計數(shù)器

引用計數(shù)的原理大致是這樣的:為每一個創(chuàng)建的對象設(shè)置一個引用計數(shù),每當(dāng)對象被引用一次后,引用計數(shù)加1,當(dāng)對象引用失效時,引用計數(shù)減1,當(dāng)引用計數(shù)為0是說明沒有任何對象引用了,即可釋放該對象。

引用計數(shù)的一個弊端是,他無法解決對象間相互引用的問題,比如下面這段代碼:

public?class?RefrenceCountingGC?{?private?Object?instance?=?null;?public?static?void?main(String[]?args)?{
RefrenceCountingGC?gc1?=?new?RefrenceCountingGC();
RefrenceCountingGC?gc2?=?new?RefrenceCountingGC();
gc1.instance?=?gc2;
gc2.instance?=?gc1;
gc1?=?null;
gc2?=?null;?//假設(shè)采用引用計數(shù)算法,在這里發(fā)生GC,gc1和gc2能否被回收?
System.gc();
}
}

兩個對象始終處于相互引用階段,因為引用計數(shù)永遠(yuǎn)無法為0,因此就不能自動釋放它。

可達(dá)性分析

為了解決引用計數(shù)出現(xiàn)的這些問題,可達(dá)性分析算法出現(xiàn)了。

在主流的編程語言中,java和c#都是通過可達(dá)性分析來判定對象是否存活的。

它的原理大致是:通過一系列的被稱為“GC Roots”的對象作為起始點,然后從這些節(jié)點開始向下搜索,搜索的路徑連成的一條線,我們稱之為“引用鏈”,當(dāng)前一個對象到GC Roots沒有任何引用鏈,即我們說的這個對象不可達(dá)時,則說明該對象是可以被回收的,通過下圖可以更好的理解:

編程技術(shù)分享,Java虛擬機內(nèi)存管理

當(dāng)一個對象不可達(dá)時,并不能代碼這個對象就能馬上被回收,他會處于死緩狀態(tài),而一個對象真正要回收時,至少需要經(jīng)歷兩次標(biāo)記。第一次標(biāo)記的前提條件是,看該對象是否覆蓋了finalize()方法或者finalize()方法被虛擬機調(diào)用過,如果覆蓋了finalize()方法并且虛擬機還沒有調(diào)用過,這時會標(biāo)記它,該對象還有機會存活,方法很多,比如在finalize()方法內(nèi)存引用該對象。

如果進(jìn)行第二次回收時,由于虛擬機已經(jīng)調(diào)用過finalize()方法,就不會再調(diào)用他了,這時該對象就會真正宣告死亡了。

請看下面這段代碼:

public?class?GCRoot?{?private?static?GCRoot?instance?=?null;
@Override?protected?void?finalize()?throws?Throwable?{?super.finalize();
System.out.println("finalized執(zhí)行");
instance?=?this;
}?public?static?void?main(String[]?args)?throws?Exception{
instance?=?new?GCRoot();
instance?=?null;
System.gc();?//因為finalize執(zhí)行優(yōu)先級較低,這里等待0.5秒
Thread.sleep(500);?if(null?!=?instance){
System.out.println("對象拯救成功!");
}else{
System.out.println("對象被釋放!");
}?//和上面的代碼一樣,不會執(zhí)行finalize方法,所以拯救失敗
instance?=?null;
System.gc();?if(null?!=?instance){
System.out.println("對象拯救成功!");
}else{
System.out.println("對象被釋放!");
}
}
}
運行結(jié)果:
finalized執(zhí)行
對象拯救成功!
對象被釋放!

java引用

jdk1.2之前的引用很簡單,這里我們不探討,我們主要探討jdk1.2之后的引用。

java中將引用分為了:強引用、軟引用、弱引用和虛引用。

強引用

強引用在java程序中最常見的一種引用類型,類似Object o=new Object()這類引用,只要強引用還在,垃圾回收器就永遠(yuǎn)不會回收它。

軟引用

軟引用通常用來描述一些可以用但非必須的對象,在內(nèi)存溢出之前會先回收掉軟引用相關(guān)聯(lián)的對象,如果回收后內(nèi)存依然不夠,則才會拋出內(nèi)存溢出異常。

弱引用

弱引用用來描述一些非必須的對象,但是它的強度比軟引用還有弱一些。被弱引用關(guān)聯(lián)的對象只能存活到下次垃圾回收器工作之前,當(dāng)垃圾回收器開始工作時,無論當(dāng)前內(nèi)存是否足夠,都會回收掉被弱引用關(guān)聯(lián)的對象。

虛引用

虛引用是最弱的一種引用類型,為對像設(shè)置虛引用關(guān)系的唯一目的就是能在這個對象被垃圾回收之時收到一個系統(tǒng)通知。

垃圾收集算法

1、標(biāo)記-清除算法

這是最基礎(chǔ)的一種垃圾收集算法,后續(xù)所有的算法都是在這個算法的基礎(chǔ)上進(jìn)行擴展。

通過算法的名字大致能夠看出,該算法分為了“標(biāo)記”和“清除”兩個階段:首先需要標(biāo)記出需要回收的所有對象,待標(biāo)記完成后清除掉所有標(biāo)記過的對象。這個算法的不足主要有兩個:一是性能問題,標(biāo)記和清除兩個階段的性能都不高,二是標(biāo)記清除后會產(chǎn)品不連續(xù)的大量內(nèi)存碎片,內(nèi)存碎片太多會導(dǎo)致下一次在需要分配占用大量內(nèi)存的對象時,無法找到足夠的連續(xù)碎片而不得不再一次觸發(fā)垃圾收集動作。

2、復(fù)制算法

為了解決效率問題,復(fù)制算法出現(xiàn)了。這種算法會將可用內(nèi)存區(qū)域劃分為大小相同的兩塊,當(dāng)需要垃圾回收時,會先將可用的對象復(fù)制到另一個內(nèi)存區(qū)域,從而將當(dāng)前區(qū)域一次性清除。這樣做的好處是每次都將一整塊內(nèi)存區(qū)域清除掉,從而避免了大量的內(nèi)存碎片出現(xiàn)。

目前主流的商用虛擬機大多是采用復(fù)制算法來回收新生代。

3、標(biāo)記-整理算法

當(dāng)對象的存活率較高時采用復(fù)制算法,效率就會很低,因此對于老年代一般不采用復(fù)制算法。

鑒于這種問題,一種稱之為“標(biāo)記-整理”算法的思路出現(xiàn)了。它和“標(biāo)記-清除”算法一樣,都需要先進(jìn)行標(biāo)記,但是它不會簡單一次性清除標(biāo)記的對象,而是將所有存活對象都移動到另一端,然后清除掉邊界外的對象。

編程技術(shù)分享,Java虛擬機內(nèi)存管理

Java技術(shù)內(nèi)容

Java虛擬機內(nèi)存管理:http://www.ilovecolors.com.cn/tutorial_java_se/109.html

以上就是動力節(jié)點java培訓(xùn)機構(gòu)的小編針對“編程技術(shù)分享,Java虛擬機內(nèi)存管理”的內(nèi)容進(jìn)行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業(yè)老師隨時為你服務(wù)。

提交申請后,顧問老師會電話與您溝通安排學(xué)習(xí)

免費課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 日日摸夜夜添夜夜添成人 | 全色黄大色大片免费久久老太 | 日韩一级特黄毛片在线看 | 国产成人精品免费视频大全五级 | 18在线观看的 | 成人一级黄色片 | 男女性激烈动态图无遮挡 | 播放一级黄色片 | 久久这里只有精品免费播放 | 好男人www社区资源免费观看 | 亚洲va欧美va国产va天堂 | 亚洲第一色图 | 日韩欧美不卡一区二区三区 | 黄污视频免费观看 | 亚洲国产精品网站久久 | 国产在线乱子伦一区二区 | 亚洲一区二区视频在线观看 | 国产成本人三级在线观看网站 | 一级全黄视频 | 在线亚洲一区 | 国产成人永久免费视频 | 久久精品波多野结衣 | 黄色毛片小视频 | 操你啦在线播放 | 亚洲大尺度视频 | 青青草欧美 | 免费观看又黄又刺激的视频网站 | 91久久精品都在这里 | 色天使色婷婷在线影院亚洲 | 黄色网址免费大全 | 亚洲第一区视频在线观看 | 97人人艹| 欧美黄区 | 曰批免费视频播放在线看片 | 全黄一级裸片视频免费 | 天堂成人在线观看 | 91原创视频在线观看 | 欧美成人手机视频 | 免费黄色网址在线播放 | 视频福利一区 | 18女人水真多免费高清毛片 |