欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

Java虛擬機(jī)的Heap怎么理解-創(chuàng)新互聯(lián)

本篇內(nèi)容介紹了“Java虛擬機(jī)的Heap怎么理解”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

創(chuàng)新互聯(lián)公司,為您提供網(wǎng)站建設(shè)重慶網(wǎng)站制作、網(wǎng)站營(yíng)銷推廣、網(wǎng)站開發(fā)設(shè)計(jì),對(duì)服務(wù)成都資質(zhì)代辦等多個(gè)行業(yè)擁有豐富的網(wǎng)站建設(shè)及推廣經(jīng)驗(yàn)。創(chuàng)新互聯(lián)公司網(wǎng)站建設(shè)公司成立于2013年,提供專業(yè)網(wǎng)站制作報(bào)價(jià)服務(wù),我們深知市場(chǎng)的競(jìng)爭(zhēng)激烈,認(rèn)真對(duì)待每位客戶,為客戶提供賞心悅目的作品。 與客戶共同發(fā)展進(jìn)步,是我們永遠(yuǎn)的責(zé)任!

在Java虛擬機(jī)中,我是一個(gè)位高權(quán)重的大管家,他們都很怕我,尤其是那些Java 對(duì)象,我把他們?nèi)Φ揭粋€(gè)叫做Heap的“監(jiān)獄”里,嚴(yán)格管理,生殺大權(quán)盡在掌握。

中國(guó)人把Stack翻譯成“棧”,把Heap翻譯成“堆”, 還有人會(huì)把Stack翻譯成“堆棧”,唉,真不知道他們是怎么想的, 不過(guò)這么多年都過(guò)來(lái)了,你們明白就好。

碰巧我會(huì)對(duì)Heap中的Java 對(duì)象做垃圾回收,這個(gè)“堆”總是讓我聯(lián)想到垃圾堆。

說(shuō)起垃圾回收,這實(shí)在是一個(gè)大負(fù)擔(dān),原因很簡(jiǎn)單,那些寫Java程序的人類只管把對(duì)象給new出來(lái),扔到Heap 中, 但是從來(lái)不管把他delete 掉, 刪掉這些對(duì)象的責(zé)任就落到了我的頭上,我不嚴(yán)格管理怎么行?

有時(shí)候我挺羨慕C和C++, 必須得手動(dòng)地分配和釋放內(nèi)存,出了錯(cuò)都是程序員來(lái)背鍋。

在我這里,如果任由這些對(duì)象肆意妄為,我那容量不高的,Java虛擬機(jī)啟動(dòng)后就無(wú)法更改的Heap“監(jiān)獄”很快就會(huì)被填滿, 所以我必須得派出我的得力助手,專門找到并且清理那些不用的Java 對(duì)象, 把他們占據(jù)的空間給釋放掉。

為了找到這些搗亂分子,我發(fā)明了一個(gè)叫做“可達(dá)性分析”的算法,這個(gè)算法估計(jì)大部分人已經(jīng)知道了,我就不再啰嗦了,下面這張圖說(shuō)明了背后的思想,聰明的你一眼就能看出來(lái), 橙色的對(duì)象都是不可達(dá)對(duì)象,可以回收。

Java虛擬機(jī)的Heap怎么理解

1、Heap監(jiān)獄

好吧,現(xiàn)在詳細(xì)說(shuō)一下我管理的Heap“監(jiān)獄”。

你可以把它想象成一大片空間,為了方便管理, 我把Heap“監(jiān)獄”劃分成多個(gè)區(qū)域,然后把那些Java對(duì)象在其中搬來(lái)搬去。

Java虛擬機(jī)的Heap怎么理解

我定的規(guī)矩就是: 新來(lái)的家伙們都要進(jìn)入新生代待著,新生代住不下了,我就派出清理者進(jìn)行垃圾回收(Minor GC),回收以后還住不下,那就把年齡大的老家伙們趕到養(yǎng)老院(老年代)去。

每個(gè)在Heap中的Java對(duì)象我都會(huì)設(shè)置一個(gè)年齡計(jì)數(shù)器,每次Java對(duì)象熬過(guò)一次GC,就把年齡加1, 如果老到一定程度,對(duì)不起,請(qǐng)進(jìn)入養(yǎng)老院(老年代)。  實(shí)際上我還會(huì)做動(dòng)態(tài)的年齡判斷,這里按下不表。

你可能會(huì)覺(jué)得奇怪,為什么在新生代里分出了Eden, Survivor1, Survivor2這樣奇怪的區(qū)域?

那是因?yàn)槲蚁朐谶@里實(shí)現(xiàn)一個(gè)所謂的“復(fù)制”算法。

最早的時(shí)候, 我是把一個(gè)內(nèi)存的區(qū)域劃分成大小相當(dāng)?shù)膬蓚€(gè)區(qū)域,每次只用其中的一個(gè)。

Java虛擬機(jī)的Heap怎么理解

區(qū)域1用完了,我就做垃圾回收,把存活的都搬到另外一個(gè)區(qū)域。

注意:搬過(guò)去以后,他們都會(huì)緊緊地挨在一起居住,這樣以來(lái),被清理掉的那些紅色碎片就會(huì)重新平整成一大塊空間,方便后續(xù)使用,尤其是針對(duì)大塊頭對(duì)象來(lái)了以后。

這么來(lái)回顛倒著使用兩個(gè)區(qū)域,雖然效率高,沒(méi)有碎片,但是浪費(fèi)的空間很巨大:每次只能用一半。

后來(lái)人類發(fā)現(xiàn),大部分在新生代的對(duì)象都活不了多長(zhǎng)時(shí)間,基本上一次垃圾回收就刪除得差不多了。

所以就改進(jìn)了這個(gè)只用一半的復(fù)制算法, 把新生代分成三個(gè)部分:Eden , Survivor1, Survivor2 , 他們的比例是8:1:1。

每次只使用Eden 和其中一個(gè)Survivor , 當(dāng)垃圾回收時(shí),把這兩塊區(qū)域中還活著的對(duì)象復(fù)制到另外一個(gè)Survivor, 如果Survivor放不下,請(qǐng)進(jìn)養(yǎng)老院(老年代)吧。

如果很不幸, 連養(yǎng)老院都住滿了,那只好搞一次Full GC了,這是個(gè)很慢的操作,你們最好祈禱它不要頻繁發(fā)生。

2、“監(jiān)獄”之外,大有可為

雖然我可以在Heap監(jiān)獄內(nèi)作威作福,有時(shí)候我也得接觸下監(jiān)獄之外的世界。

有一次要通過(guò)Socket向外發(fā)送數(shù)據(jù),我明明把數(shù)據(jù)準(zhǔn)備好了,就在我的Heap中,可是JVM老大竟然把數(shù)據(jù)復(fù)制了一份到Heap之外的內(nèi)存中去,然后才能通過(guò)Socket發(fā)送。

我問(wèn)他這到底是怎么回事,為什么要多此一舉,難道是對(duì)我這個(gè)Heap監(jiān)獄的大管家不放心?

JVM老大說(shuō)確實(shí)是不放心,人家底層的Socket都是C語(yǔ)言寫的, 關(guān)注的是物理內(nèi)存的地址, 你垃圾回收的時(shí)候把Java對(duì)象在什么Eden, Survivor, 老年代之間挪來(lái)挪去,對(duì)象的地址也會(huì)變來(lái)變?nèi)ィ?我怎么告訴人家到底發(fā)哪個(gè)地址的數(shù)據(jù)啊?

想想也是這個(gè)理兒,有得必有失,你程序員不用管理內(nèi)存,但是底層還得和內(nèi)存打交道,并且還額外多了一道工序:Copy 。

老大還說(shuō):“可能你還不知道,除了你的Heap監(jiān)獄,其實(shí)我在Java進(jìn)程中還有一塊兒叫做“Off-Heap內(nèi)存’的地方,數(shù)據(jù)就會(huì)復(fù)制到這里。 為了和你區(qū)分開,我把它叫做堆外內(nèi)存。”

Java虛擬機(jī)的Heap怎么理解

沒(méi)想到這里還有一塊我都管不著的“飛地”!

不過(guò)它和我也沒(méi)有什么競(jìng)爭(zhēng)關(guān)系,由它去吧。

可是沒(méi)過(guò)幾天,JVM老大再次給我?guī)?lái)了“驚喜”。

他說(shuō):“復(fù)制數(shù)據(jù)太麻煩了,我想了個(gè)辦法,可以在Java代碼中直接分配一塊屬于Off-Heap的內(nèi)存。”

我覺(jué)得頭皮發(fā)蒙:“直接在堆外內(nèi)存分配?到底怎么分配?”

老大給了我一段代碼:“看看,這不就分配了128M的堆外存嗎? 對(duì)這個(gè)buffer的讀寫操作會(huì)直接寫入堆外內(nèi)存, 不用再經(jīng)過(guò)你來(lái)復(fù)制了。”

ByteBuffer buffer = ByteBuffer.allocateDirect(1024*1024*128);

skycto JEEditor:一鍵生成功能代碼,直接面向接口編程

該死的面向接口編程,這個(gè)ByteBuffer分配出來(lái)的堆外內(nèi)存,就像一個(gè)普通的Java對(duì)象在使用,絲毫看不出它在堆內(nèi)還是在堆外。

完了,這塊內(nèi)存我是徹底管不了了。

老大看出我情緒不對(duì),安慰道: “這個(gè)buffer也是個(gè)Java對(duì)象啊, 就在你的Heap中存著,只不過(guò)它保存了那128M內(nèi)存的信息而已。”

Java虛擬機(jī)的Heap怎么理解

這還差不多 ! 既然它是個(gè)Java對(duì)象,那就得放到我的Heap監(jiān)獄中,被我控制!

可以想象,這個(gè)對(duì)象被垃圾回收的時(shí)候, 它指向的直接內(nèi)存才會(huì)被釋放。

我突然有了一個(gè)邪惡的想法:如果這樣的對(duì)象越來(lái)越多,并且一直不被垃圾回收,那對(duì)應(yīng)的直接內(nèi)存豈不也是不能釋放,然后Out of Memory ?

老大似乎看穿了我的思想:“對(duì)于這些對(duì)象,得特別小心,一定得確保能釋放。”

直接分配堆外內(nèi)存的功能正式推出了,我發(fā)現(xiàn)分配起堆外內(nèi)存要比堆內(nèi)內(nèi)存要慢一點(diǎn),心想估計(jì)沒(méi)有多少人使用吧。 可沒(méi)想到的是它特別適合那些分配次數(shù)少,讀寫操作很頻繁的場(chǎng)景。于是就受到了Netty這些通信類系統(tǒng)的熱烈歡迎。

為了減少創(chuàng)建堆外內(nèi)存的開銷,Netty 還引入了對(duì)象池的技術(shù),就像數(shù)據(jù)庫(kù)連接池一樣,先分配一些堆外內(nèi)存, 然后不斷地復(fù)用他們。

我沒(méi)想到堆外內(nèi)存能玩出這么多的花樣,但是一想到他們還是Java程序,還得用Java對(duì)象包裝,無(wú)論如何都跳不出我的手掌去,也就釋然了。

“Java虛擬機(jī)的Heap怎么理解”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

文章名稱:Java虛擬機(jī)的Heap怎么理解-創(chuàng)新互聯(lián)
新聞來(lái)源:http://www.chinadenli.net/article16/dgesdg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站虛擬主機(jī)定制網(wǎng)站網(wǎng)站排名品牌網(wǎng)站建設(shè)全網(wǎng)營(yíng)銷推廣

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁(yè)設(shè)計(jì)公司