亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

JVM內(nèi)存模型以及垃圾收集策略解析

系統(tǒng) 1810 0

一JVM內(nèi)存模型

1.1Java棧

Java棧是與每一個(gè)線程關(guān)聯(lián)的,JVM在創(chuàng)建每一個(gè)線程的時(shí)候,會(huì)分配一定的棧空間給線程。它主要用來存儲線程執(zhí)行過程中的局部變量,方法的返回值,以及方法調(diào)用上下文。棧空間隨著線程的終止而釋放。

StackOverflowError:如果在線程執(zhí)行的過程中,棧空間不夠用,那么JVM就會(huì)拋出此異常,這種情況一般是死遞歸造成的。

1.2堆

Java中堆是由所有的線程共享的一塊內(nèi)存區(qū)域,堆用來保存各種JAVA對象,比如數(shù)組,線程對象等。

1.2.1Generation

JVM堆一般又可以分為以下三部分:

?Perm

Perm代主要保存class,method,filed對象,這部門的空間一般不會(huì)溢出,除非一次性加載了很多的類,不過在涉及到熱部署的應(yīng)用服務(wù)器的時(shí)候,有時(shí)候會(huì)遇到j(luò)ava.lang.OutOfMemoryError:PermGenspace的錯(cuò)誤,造成這個(gè)錯(cuò)誤的很大原因就有可能是每次都重新部署,但是重新部署后,類的class沒有被卸載掉,這樣就造成了大量的class對象保存在了perm中,這種情況下,一般重新啟動(dòng)應(yīng)用服務(wù)器可以解決問題。

?Tenured

Tenured區(qū)主要保存生命周期長的對象,一般是一些老的對象,當(dāng)一些對象在Young復(fù)制轉(zhuǎn)移一定的次數(shù)以后,對象就會(huì)被轉(zhuǎn)移到Tenured區(qū),一般如果系統(tǒng)中用了application級別的緩存,緩存中的對象往往會(huì)被轉(zhuǎn)移到這一區(qū)間。

?Young

Young區(qū)被劃分為三部分,Eden區(qū)和兩個(gè)大小嚴(yán)格相同的Survivor區(qū),其中Survivor區(qū)間中,某一時(shí)刻只有其中一個(gè)是被使用的,另外一個(gè)留做垃圾收集時(shí)復(fù)制對象用,在Young區(qū)間變滿的時(shí)候,minorGC就會(huì)將存活的對象移到空閑的Survivor區(qū)間中,根據(jù)JVM的策略,在經(jīng)過幾次垃圾收集后,任然存活于Survivor的對象將被移動(dòng)到Tenured區(qū)間。

1.2.2SizingtheGenerations

JVM提供了相應(yīng)的參數(shù)來對內(nèi)存大小進(jìn)行配置。

正如上面描述,JVM中堆被分為了3個(gè)大的區(qū)間,同時(shí)JVM也提供了一些選項(xiàng)對Young,Tenured的大小進(jìn)行控制。

?TotalHeap

-Xms:指定了JVM初始啟動(dòng)以后初始化內(nèi)存

-Xmx:指定JVM堆得最大內(nèi)存,在JVM啟動(dòng)以后,會(huì)分配-Xmx參數(shù)指定大小的內(nèi)存給JVM,但是不一定全部使用,JVM會(huì)根據(jù)-Xms參數(shù)來調(diào)節(jié)真正用于JVM的內(nèi)存

-Xmx-Xms之差就是三個(gè)Virtual空間的大小

?YoungGeneration

-XX:NewRatio=8意味著tenured和young的比值8:1,這樣eden+2*survivor=1/9

堆內(nèi)存

-XX:SurvivorRatio=32意味著eden和一個(gè)survivor的比值是32:1,這樣一個(gè)Survivor就占Young區(qū)的1/34.

-Xmn參數(shù)設(shè)置了年輕代的大小

?PermGeneration

-XX:PermSize=16M-XX:MaxPermSize=64M

Thread Stack

-XX:Xss=128K

1.3堆棧分離的好處

呵呵,其它的先不說了,就來說說面向?qū)ο蟮脑O(shè)計(jì)吧,當(dāng)然除了面向?qū)ο蟮脑O(shè)計(jì)帶來的維護(hù)性,復(fù)用性和擴(kuò)展性方面的好處外,我們看看面向?qū)ο笕绾吻擅畹睦昧硕褩7蛛x。如果從JAVA內(nèi)存模型的角度去理解面向?qū)ο蟮脑O(shè)計(jì),我們就會(huì)發(fā)現(xiàn)對象它完美的表示了堆和棧,對象的數(shù)據(jù)放在堆中,而我們編寫的那些方法一般都是運(yùn)行在棧中,因此面向?qū)ο蟮脑O(shè)計(jì)是一種非常完美的設(shè)計(jì)方式,它完美的統(tǒng)一了數(shù)據(jù)存儲和運(yùn)行。

二JAVA垃圾收集器

2.1垃圾收集簡史

垃圾收集提供了內(nèi)存管理的機(jī)制,使得應(yīng)用程序不需要在關(guān)注內(nèi)存如何釋放,內(nèi)存用完后,垃圾收集會(huì)進(jìn)行收集,這樣就減輕了因?yàn)槿藶榈墓芾韮?nèi)存而造成的錯(cuò)誤,比如在C++語言里,出現(xiàn)內(nèi)存泄露時(shí)很常見的。

Java語言是目前使用最多的依賴于垃圾收集器的語言,但是垃圾收集器策略從20世紀(jì)60年代就已經(jīng)流行起來了,比如Smalltalk,Eiffel等編程語言也集成了垃圾收集器的機(jī)制。

2.2常見的垃圾收集策略

所有的垃圾收集算法都面臨同一個(gè)問題,那就是找出應(yīng)用程序不可到達(dá)的內(nèi)存塊,將其釋放,這里面得不可到達(dá)主要是指應(yīng)用程序已經(jīng)沒有內(nèi)存塊的引用了,而在JAVA中,某個(gè)對象對應(yīng)用程序是可到達(dá)的是指:這個(gè)對象被根(根主要是指類的靜態(tài)變量,或者活躍在所有線程棧的對象的引用)引用或者對象被另一個(gè)可到達(dá)的對象引用。

2.2.1ReferenceCounting(引用計(jì)數(shù))

引用計(jì)數(shù)是最簡單直接的一種方式,這種方式在每一個(gè)對象中增加一個(gè)引用的計(jì)數(shù),這個(gè)計(jì)數(shù)代表當(dāng)前程序有多少個(gè)引用引用了此對象,如果此對象的引用計(jì)數(shù)變?yōu)?,那么此對象就可以作為垃圾收集器的目標(biāo)對象來收集。

優(yōu)點(diǎn):

簡單,直接,不需要暫停整個(gè)應(yīng)用

缺點(diǎn):

1.需要編譯器的配合,編譯器要生成特殊的指令來進(jìn)行引用計(jì)數(shù)的操作,比如每次將對象賦值給新的引用,或者者對象的引用超出了作用域等。

2.不能處理循環(huán)引用的問題

2.2.2跟蹤收集器

跟蹤收集器首先要暫停整個(gè)應(yīng)用程序,然后開始從根對象掃描整個(gè)堆,判斷掃描的對象是否有對象引用,這里面有三個(gè)問題需要搞清楚:

1.如果每次掃描整個(gè)堆,那么勢必讓GC的時(shí)間變長,從而影響了應(yīng)用本身的執(zhí)行。因此在JVM里面采用了分代收集,在新生代收集的時(shí)候minorgc只需要掃描新生代,而不需要掃描老生代。

2.JVM采用了分代收集以后,minorgc只掃描新生代,但是minorgc怎么判斷是否有老生代的對象引用了新生代的對象,JVM采用了卡片標(biāo)記的策略,卡片標(biāo)記將老生代分成了一塊一塊的,劃分以后的每一個(gè)塊就叫做一個(gè)卡片,JVM采用卡表維護(hù)了每一個(gè)塊的狀態(tài),當(dāng)JAVA程序運(yùn)行的時(shí)候,如果發(fā)現(xiàn)老生代對象引用或者釋放了新生代對象的引用,那么就JVM就將卡表的狀態(tài)設(shè)置為臟狀態(tài),這樣每次minorgc的時(shí)候就會(huì)只掃描被標(biāo)記為臟狀態(tài)的卡片,而不需要掃描整個(gè)堆。具體如下圖:

3.GC在收集一個(gè)對象的時(shí)候會(huì)判斷是否有引用指向?qū)ο螅贘AVA中的引用主要有四種:Strongreference,Softreference,Weakreference,Phantomreference.

?StrongReference

強(qiáng)引用是JAVA中默認(rèn)采用的一種方式,我們平時(shí)創(chuàng)建的引用都屬于強(qiáng)引用。如果一個(gè)對象沒有強(qiáng)引用,那么對象就會(huì)被回收。

publicvoidtestStrongReference(){

Objectreferent=newObject();

ObjectstrongReference=referent;

referent=null;

System.gc();

assertNotNull(strongReference);

}

?SoftReference

軟引用的對象在GC的時(shí)候不會(huì)被回收,只有當(dāng)內(nèi)存不夠用的時(shí)候才會(huì)真正的回收,因此軟

JVM內(nèi)存模型以及垃圾收集策略解析


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會(huì)非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: a免费国产一级特黄aa大 | 66精品综合久久久久久久 | 五月婷中文 | 米奇久久 | 久久99久久99小草精品免视看 | 日本高清免费视频不卡a | 青青青国产精品手机在线观看 | 91久久精品一区二区三区 | 天天综合久久久网 | 欧美刺激午夜性久久久久久久 | 奇米影视一区二区三区 | 国产国产精品人在线观看 | 国产大毛片 | 日韩一区二区三区免费 | 高清国产美女一级a毛片录 高清国产美女一级毛片 | videoxxoo欧美老师 | 亚洲欧美一区二区三区 | 97影院九七影院理论片 | 黄色α片 | 性生大片一级毛片免费观看 | 欧美一级黄色片在线观看 | 欧美亚洲另类图片 | 日韩黄色录像 | 亚洲国产天堂久久精品网 | 久草免费色站 | 免费精品美女久久久久久久久久 | 青草香蕉精品视频在线观看 | 久久精品综合一区二区三区 | 99免费在线播放99久久免费 | 国产香蕉在线观看 | 伊人久操| 久久国产在线观看 | 男人免费网站 | 国产剧情一区二区三区 | 91久久夜色精品国产九色 | 在线观看人成午夜影片 | 免费播放美女一级毛片 | 四虎网站入口 | 国产美女午夜精品福利视频 | 天天干夜夜 | 成年人色视频 |