国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設(shè)計 > 正文

讀書筆記3-《crazy java》

2019-11-14 10:18:20
字體:
供稿:網(wǎng)友

通過關(guān)鍵字new創(chuàng)建java對象,即可視為java對象申請內(nèi)存空間,JVM會在內(nèi)存堆中為每個對象分配空間,當一個java對象失去引用時,JVM的垃圾回收機制會自動清除他們,并回收它們所占的內(nèi)存空間。

是否回收一個對象的標準:是否還有引用變量引用該對象

JVM的垃圾回收機制采用有向圖方式來管理內(nèi)存中的對象。對象在堆內(nèi)存中的三種狀態(tài): 1. 可達狀態(tài):有一個以上的引用變量引用它, 在有向圖中可以從起始頂點導航到該對象, 程序可通過引用變量來調(diào)用該對象的屬性和方法 2. 可恢復狀態(tài):某個對象不再被任何對象引用,從起始頂點不能導航到該對象,在回收該對象之前,系統(tǒng)會調(diào)用finalize方法進行資源清理,如果系統(tǒng)在調(diào)用finalizde后重新讓一個以上的引用變量引用該對象,則再次變?yōu)榭蛇_狀態(tài),反之為不可達狀態(tài) 3.不可達狀態(tài):對象的所有關(guān)聯(lián)被切斷,且調(diào)用finalize后仍為不可達,即對象永久失去引用

當某個對象被其他類的類變量引用時,只有該類被銷毀后該對象才會進入可恢復狀態(tài);當某個對象被其他對象的實例變量引用時,只有當引用該對象的對象被銷毀或變?yōu)椴豢蛇_之后才會能進入不可達狀態(tài)。

強引用:程序創(chuàng)建一個對象,并把這個對象賦給一個引用變量 軟引用:用SoftReference類加以實現(xiàn),當系統(tǒng)空間足夠時不會被系統(tǒng)回收,當系統(tǒng)空間不足時會被回收 弱引用:通過WeakReference類實現(xiàn),和軟引用很像,但弱引用的引用級別更低。當系統(tǒng)回收機制運行時,不管系統(tǒng)內(nèi)存是否足夠,總會回收該對象所占用的內(nèi)存。 虛引用:跟蹤對象被垃圾回收的狀態(tài),程序可以通過檢查與虛引用關(guān)聯(lián)的引用隊列中是否已經(jīng)包含指定的虛引用,從而了解虛引用所引用對象是否即將被回收。虛引用必須和引用隊列聯(lián)合使用。

內(nèi)存泄漏:存在無用的額內(nèi)存沒有被回收回來 java內(nèi)存泄漏的原因: JVM肯定不會回收強引用所引用的java對象,即使系統(tǒng)內(nèi)存非常緊張,即使該對象以后永遠不會被用到 產(chǎn)生的原因:所有不可達的對象都由垃圾回收機負責回收,因此程序猿不需考慮這部分的內(nèi)存泄漏。但如果程序中的一些java對象處于可達狀態(tài),但程序以后永遠都不會訪問他們,則占據(jù)的內(nèi)存空間不會被回收,因此發(fā)生內(nèi)存泄漏。

垃圾回收機制完成的兩件事: 1. 跟蹤并監(jiān)控每個java對象,當某個對象處于不可達狀態(tài)時,回收該對象所占用的內(nèi)存; 2. 清理內(nèi)存分配、回收過程中產(chǎn)生的內(nèi)存碎片

垃圾回收的設(shè)計算法: 1. 串行回收:始終使用一個CPU來執(zhí)行垃圾回收操作 2. 并行回收:每個CPU負責回收工作的一部分,效率高,同時復雜度也在提升,內(nèi)存碎片會增加 3. 應用程序停止:執(zhí)行垃圾回收的同時會導致應用程序的暫停 4. 并發(fā)執(zhí)行:不會導致應用程序停止,需解決和應用程序的執(zhí)行沖突,開銷比應用程序停止的方法大,需更多的堆內(nèi)存 5. 復制式:將所有可達對象復制到另一塊相同的內(nèi)存中,然后一次性回收整個空間,不產(chǎn)生內(nèi)存碎片,但需要額外的內(nèi)存 6. 不壓縮式: 從根訪問所有可達對象并標記,再次遍歷內(nèi)存區(qū)域,回收處理未標記的對象,內(nèi)存利用率高,但需遍歷兩次堆內(nèi)存,易產(chǎn)生碎片 7. 壓縮式:從根訪問所有可達對象并標記,將所有可達對象搬遷到一起,之前占用的內(nèi)存全部回收

現(xiàn)行的垃圾回收器采用分代的方式來進行回收,根據(jù)對象生存時間的長短分為young、old、permanent,基于以下兩點事實: 1. 絕大多數(shù)的對象在young期間就會被回收; 2. 很老的對象和很新的對象很少存在相互引用

young代采用復制算法,因為大部分對象很快進入不可達狀態(tài)。只需遍歷那些處于可達狀態(tài)的對象,而且這些對象的數(shù)量較少,復制成本不大,因此可充分發(fā)揮復制算法的優(yōu)點。 young代由1個Eden區(qū)和兩個Survivor區(qū)構(gòu)成。絕大多數(shù)的對象先分配到Eden區(qū),Survivor區(qū)中的對象至少在young代中經(jīng)歷了一次垃圾回收,同一時間1個survivor用來保存對象,另一個是空的。復制就是將Eden和非空的survivor復制到另一個survivor

old代垃圾回收具有如下兩個特征: 1. old代垃圾回收的執(zhí)行頻率無需太高,因此很少有對象會死掉 2. 每次對old代執(zhí)行垃圾回收需要更長的時間來完成 基于以上考慮,會采用標記壓縮算法,可避免復制old代的大量對象,而且由于old代的對象不會很快死亡,回收過程在并不會產(chǎn)生大量的內(nèi)存碎片

permanent代中的對象垃圾回收機制通常不會回收

總結(jié): young代回收的系統(tǒng)開銷比較小,也被稱為次要回收。old代回收的成本較大,稱為主要回收。young代的內(nèi)存會先被回收,對于old代的回收頻率則要低的多。

常見的垃圾回收器: 1. 串行回收器:young代和old代的回收都是串行的 2. 并行回收器:比串行回收器增加了多CPU并行的能力,即同時啟動多線程并行來執(zhí)行垃圾回收,并行只針對young代的復制算法 3.并行壓縮回收器:會old代采用不同的算法(先劃分幾個固定大小的區(qū)域,mark階段多線程標記可達對象,summary階段從最左邊的區(qū)域檢查每個區(qū)域的密度,當檢測到可達密度較小時會對其和右側(cè)區(qū)域進行回收,comact階段利用多線程并行復制數(shù)據(jù)到密集區(qū)域) 4.并發(fā)標示-清理回收器(CMS):young代回收方式保持不變,CMS對多數(shù)old代回收為并發(fā)操作,可分為初始標識、并發(fā)標識和再標識。只需兩次短暫的暫停,適用于對實時性要求較高的程序,但需要的堆內(nèi)存也是最大的

內(nèi)存管理小技巧: 1. 直接采用直接量創(chuàng)建,不用new的方式來創(chuàng)建 2. 盡早釋放無用對象的引用:方法局部變量引用所引用的對象會隨著方法的結(jié)束變?yōu)槔⒑芸毂籎VM回收。 3. 盡量少用靜態(tài)變量:類變量會存放到permanent代中,只要類對象存在就不會被垃圾回收 4. 避免在經(jīng)常調(diào)用的方法、循環(huán)中創(chuàng)建java對象 5.緩存經(jīng)常使用的對象:使用HashMap進行緩存,直接使用某些開源的緩存項目 6. 盡量不要使用finalize的方法 7. 考慮使用軟引用:當系統(tǒng)內(nèi)存緊張時,系統(tǒng)會自動釋放軟引用所引用的對象


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 宕昌县| 安阳市| 叙永县| 米林县| 乐都县| 古浪县| 高安市| 夏河县| 卫辉市| 梓潼县| 河东区| 平泉县| 池州市| 喀喇沁旗| 新邵县| 福海县| 北海市| 星子县| 河津市| 秦皇岛市| 突泉县| 大足县| 城步| 百色市| 南康市| 阿克陶县| 华坪县| 望江县| 台北市| 镇宁| 白银市| 朝阳县| 巢湖市| 多伦县| 疏勒县| 巫山县| 和硕县| 额尔古纳市| 甘南县| 岳阳县| 远安县|