最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android垃圾回收機(jī)制及程序優(yōu)化System.gc

 更新時(shí)間:2016年01月11日 10:09:25   作者:小不點(diǎn)  
這篇文章主要介紹了Android垃圾回收機(jī)制及程序優(yōu)化System.gc的相關(guān)資料,需要的朋友可以參考下

1.垃圾收集算法的核心思想

  Java語(yǔ)言建立了垃圾收集機(jī)制,用以跟蹤正在使用的對(duì)象和發(fā)現(xiàn)并回收不再使用(引用)的對(duì)象。該機(jī)制可以有效防范動(dòng)態(tài)內(nèi)存分配中可能發(fā)生的兩個(gè)危險(xiǎn):因內(nèi)存垃圾過多而引發(fā)的內(nèi)存耗盡,以及不恰當(dāng)?shù)膬?nèi)存釋放所造成的內(nèi)存非法引用。

  垃圾收集算法的核心思想是:對(duì)虛擬機(jī)可用內(nèi)存空間,即堆空間中的對(duì)象進(jìn)行識(shí)別,如果對(duì)象正在被引用,那么稱其為存活對(duì)象,反之,如果對(duì)象不再被引用,則為垃圾對(duì)象,可以回收其占據(jù)的空間,用于再分配。垃圾收集算法的選擇和垃圾收集系統(tǒng)參數(shù)的合理調(diào)節(jié)直接影響著系統(tǒng)性能,因此需要開發(fā)人員做比較深入的了解。

2.觸發(fā)主GC(Garbage Collector)的條件

  JVM進(jìn)行次GC的頻率很高,但因?yàn)檫@種GC占用時(shí)間極短,所以對(duì)系統(tǒng)產(chǎn)生的影響不大。更值得關(guān)注的是主GC的觸發(fā)條件,因?yàn)樗鼘?duì)系統(tǒng)影響很明顯。總的來說,有兩個(gè)條件會(huì)觸發(fā)主GC:
 ?、佼?dāng)應(yīng)用程序空閑時(shí),即沒有應(yīng)用線程在運(yùn)行時(shí),GC會(huì)被調(diào)用。因?yàn)镚C在優(yōu)先級(jí)最低的線程中進(jìn)行,所以當(dāng)應(yīng)用忙時(shí),GC線程就不會(huì)被調(diào)用,但以下條件除外。

  ②Java堆內(nèi)存不足時(shí),GC會(huì)被調(diào)用。當(dāng)應(yīng)用線程在運(yùn)行,并在運(yùn)行過程中創(chuàng)建新對(duì)象,若這時(shí)內(nèi)存空間不足,JVM就會(huì)強(qiáng)制地調(diào)用GC線程,以便回收內(nèi)存用于新的分配。若GC一次之后仍不能滿足內(nèi)存分配的要求,JVM會(huì)再進(jìn)行兩次GC作進(jìn)一步的嘗試,若仍無法滿足要求,則 JVM將報(bào)“out of memory”的錯(cuò)誤,Java應(yīng)用將停止。

  由于是否進(jìn)行主GC由JVM根據(jù)系統(tǒng)環(huán)境決定,而系統(tǒng)環(huán)境在不斷的變化當(dāng)中,所以主GC的運(yùn)行具有不確定性,無法預(yù)計(jì)它何時(shí)必然出現(xiàn),但可以確定的是對(duì)一個(gè)長(zhǎng)期運(yùn)行的應(yīng)用來說,其主GC是反復(fù)進(jìn)行的。

3.減少GC開銷的措施

  根據(jù)上述GC的機(jī)制,程序的運(yùn)行會(huì)直接影響系統(tǒng)環(huán)境的變化,從而影響GC的觸發(fā)。若不針對(duì)GC的特點(diǎn)進(jìn)行設(shè)計(jì)和編碼,就會(huì)出現(xiàn)內(nèi)存駐留等一系列負(fù)面影響。為了避免這些影響,基本的原則就是盡可能地減少垃圾和減少GC過程中的開銷。具體措施包括以下幾個(gè)方面:

  (1)不要顯式調(diào)用System.gc()

  此函數(shù)建議JVM進(jìn)行主GC,雖然只是建議而非一定,但很多情況下它會(huì)觸發(fā)主GC,從而增加主GC的頻率,也即增加了間歇性停頓的次數(shù)。

  (2)盡量減少臨時(shí)對(duì)象的使用

  臨時(shí)對(duì)象在跳出函數(shù)調(diào)用后,會(huì)成為垃圾,少用臨時(shí)變量就相當(dāng)于減少了垃圾的產(chǎn)生,從而延長(zhǎng)了出現(xiàn)上述第二個(gè)觸發(fā)條件出現(xiàn)的時(shí)間,減少了主GC的機(jī)會(huì)。

  (3)對(duì)象不用時(shí)最好顯式置為Null

  一般而言,為Null的對(duì)象都會(huì)被作為垃圾處理,所以將不用的對(duì)象顯式地設(shè)為Null,有利于GC收集器判定垃圾,從而提高了GC的效率。

  (4)盡量使用StringBuffer,而不用String來累加字符串(詳見blog另一篇文章JAVA中String與StringBuffer)

  由于String是固定長(zhǎng)的字符串對(duì)象,累加String對(duì)象時(shí),并非在一個(gè)String對(duì)象中擴(kuò)增,而是重新創(chuàng)建新的String對(duì)象,如 Str5=Str1+Str2+Str3+Str4,這條語(yǔ)句執(zhí)行過程中會(huì)產(chǎn)生多個(gè)垃圾對(duì)象,因?yàn)閷?duì)次作“+”操作時(shí)都必須創(chuàng)建新的String對(duì)象,但這些過渡對(duì)象對(duì)系統(tǒng)來說是沒有實(shí)際意義的,只會(huì)增加更多的垃圾。避免這種情況可以改用StringBuffer來累加字符串,因StringBuffer 是可變長(zhǎng)的,它在原有基礎(chǔ)上進(jìn)行擴(kuò)增,不會(huì)產(chǎn)生中間對(duì)象。

  (5)能用基本類型如Int,Long,就不用Integer,Long對(duì)象

  基本類型變量占用的內(nèi)存資源比相應(yīng)對(duì)象占用的少得多,如果沒有必要,最好使用基本變量。

  (6)盡量少用靜態(tài)對(duì)象變量

  靜態(tài)變量屬于全局變量,不會(huì)被GC回收,它們會(huì)一直占用內(nèi)存。

  (7)分散對(duì)象創(chuàng)建或刪除的時(shí)間

  集中在短時(shí)間內(nèi)大量創(chuàng)建新對(duì)象,特別是大對(duì)象,會(huì)導(dǎo)致突然需要大量?jī)?nèi)存,JVM在面臨這種情況時(shí),只能進(jìn)行主GC,以回收內(nèi)存或整合內(nèi)存碎片, 從而增加主GC的頻率。集中刪除對(duì)象,道理也是一樣的。它使得突然出現(xiàn)了大量的垃圾對(duì)象,空閑空間必然減少,從而大大增加了下一次創(chuàng)建新對(duì)象時(shí)強(qiáng)制主GC 的機(jī)會(huì)。

-------------------------------------------------------------

很多人把Java的“效率低下”歸咎于不能自由管理內(nèi)存,但我們也知道將內(nèi)存管理封裝起來的好處,這里就不贅述。

Java中的內(nèi)存分配是隨著new一個(gè)新的對(duì)象來實(shí)現(xiàn)的,這個(gè)很簡(jiǎn)單,而且也還是有一些可以“改進(jìn)”內(nèi)存回收的機(jī)制的,其中最顯眼的就是這個(gè)System.gc()函數(shù)。

乍一看這個(gè)函數(shù)似乎是可以進(jìn)行垃圾回收的,可事實(shí)并不是那么簡(jiǎn)單。

其實(shí)這個(gè)gc()函數(shù)的作用只是提醒虛擬機(jī):程序員希望進(jìn)行一次垃圾回收。但是它不能保證垃圾回收一定會(huì)進(jìn)行,而且具體什么時(shí)候進(jìn)行是取決于具體的虛擬機(jī)的,不同的虛擬機(jī)有不同的對(duì)策。

那么下一個(gè)問題就是:gc()進(jìn)行回收的準(zhǔn)則是什么?也就是說什么樣的對(duì)象可以被回收?

簡(jiǎn)單來說就是:沒有被任何可達(dá)變量指向的對(duì)象。這里的可達(dá)是我發(fā)明的……意思就是能夠找到的,那什么樣的是不可達(dá)的呢?

比如說:

a.v = b;
b.v = c;
/*
*Watch out !
*/
a.v = d;

看一下這段代碼:

第一行:對(duì)象a的變量v指向了對(duì)象b
第二行:對(duì)象b的變量v指向了對(duì)象c
第六行:對(duì)象a的變量v指向了變量d。

這個(gè)時(shí)候,雖然變量c指向的對(duì)象有c 以及b.v指向它,但是它們都已經(jīng)不可達(dá)了,為什么?因?yàn)槲ㄒ豢梢哉业剿鼈兊氖莂.v,但是現(xiàn)在a.v指向了d,所以他們就是不可達(dá)的了。
理由也很直觀:沒有任何可達(dá)變量指向你,你還有活下去的理由嗎?你就算活下去誰(shuí)能找得到你呢?

所以說,C++中將釋放了的指針置為null的習(xí)慣要保留到Java中,因?yàn)檫@有可能是你釋放內(nèi)存的唯一途徑。

最后的箴言:不要頻繁使用gc函數(shù)。

最后給大家說下為什么需要GC

應(yīng)用程序?qū)Y源操作,通常簡(jiǎn)單分為以下幾個(gè)步驟:

1、為對(duì)應(yīng)的資源分配內(nèi)存

2、初始化內(nèi)存

3、使用資源

4、清理資源

5、釋放內(nèi)存

應(yīng)用程序?qū)Y源(內(nèi)存使用)管理的方式,常見的一般有如下幾種:

1、手動(dòng)管理:C,C++

2、計(jì)數(shù)管理:COM

3、自動(dòng)管理:.NET,Java,PHP,GO…

但是,手動(dòng)管理和計(jì)數(shù)管理的復(fù)雜性很容易產(chǎn)生以下典型問題:

1.程序員忘記去釋放內(nèi)存

2.應(yīng)用程序訪問已經(jīng)釋放的內(nèi)存

產(chǎn)生的后果很嚴(yán)重,常見的如內(nèi)存泄露、數(shù)據(jù)內(nèi)容亂碼,而且大部分時(shí)候,程序的行為會(huì)變得怪異而不可預(yù)測(cè),還有Access Violation等。

.NET、Java等給出的解決方案,就是通過自動(dòng)垃圾回收機(jī)制GC進(jìn)行內(nèi)存管理。這樣,問題1自然得到解決,問題2也沒有存在的基礎(chǔ)。

總結(jié):無法自動(dòng)化的內(nèi)存管理方式極容易產(chǎn)生bug,影響系統(tǒng)穩(wěn)定性,尤其是線上多服務(wù)器的集群環(huán)境,程序出現(xiàn)執(zhí)行時(shí)bug必須定位到某臺(tái)服務(wù)器然后dump內(nèi)存再分析bug所在,極其打擊開發(fā)人員編程積極性,而且源源不斷的類似bug讓人厭惡。

相關(guān)文章

  • Android序列化XML數(shù)據(jù)

    Android序列化XML數(shù)據(jù)

    有時(shí)候一些項(xiàng)目中需要傳遞一些XML格式的數(shù)據(jù),如何把一個(gè)對(duì)象序列化為XML格式,本文就講講Android序列化XML數(shù)據(jù)的方法
    2013-11-11
  • Android動(dòng)畫之漸變動(dòng)畫(Tween Animation)詳解 (漸變、縮放、位移、旋轉(zhuǎn))

    Android動(dòng)畫之漸變動(dòng)畫(Tween Animation)詳解 (漸變、縮放、位移、旋轉(zhuǎn))

    這篇文章主要介紹了Android動(dòng)畫之漸變動(dòng)畫(Tween Animation)用法,結(jié)合實(shí)例形式詳細(xì)分析了Android漸變動(dòng)畫Tween Animation實(shí)現(xiàn)漸變,縮放,位移,旋轉(zhuǎn)等技巧,需要的朋友可以參考下
    2016-01-01
  • Android 插件化處理方案詳解

    Android 插件化處理方案詳解

    這篇文章主要介紹了Android 插件化處理方案的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用Android開發(fā),感興趣的朋友可以了解下
    2021-04-04
  • 最常用和最難用的Android控件ListView

    最常用和最難用的Android控件ListView

    這篇文章主要為大家詳細(xì)介紹了最常用和最難用的Android控件ListView的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • android實(shí)用工具類分享(獲取內(nèi)存/檢查網(wǎng)絡(luò)/屏幕高度/手機(jī)分辨率)

    android實(shí)用工具類分享(獲取內(nèi)存/檢查網(wǎng)絡(luò)/屏幕高度/手機(jī)分辨率)

    這篇文章主要介紹了android實(shí)用工具類,包括獲取內(nèi)存、檢查網(wǎng)絡(luò)、屏幕高度、手機(jī)分辨率、獲取版本號(hào)等功能,需要的朋友可以參考下
    2014-03-03
  • Android開啟新線程實(shí)現(xiàn)電子廣告牌項(xiàng)目

    Android開啟新線程實(shí)現(xiàn)電子廣告牌項(xiàng)目

    這篇文章主要為大家詳細(xì)介紹了Android開啟新線程實(shí)現(xiàn)電子廣告牌項(xiàng)目,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Android ViewPager的MVP架構(gòu)搭建過程

    Android ViewPager的MVP架構(gòu)搭建過程

    本文主要介紹了ViewPager在Android中的作用以及使用場(chǎng)景,如引導(dǎo)頁(yè)、圖片瀏覽器、新聞或文章內(nèi)容的多標(biāo)簽頁(yè)等,同時(shí),還詳細(xì)闡述了如何通過MVP架構(gòu)來搭建ViewPager,將視圖和邏輯進(jìn)行解耦,提高代碼的可測(cè)試性、可復(fù)用性,使代碼結(jié)構(gòu)更清晰且易于擴(kuò)展功能
    2024-10-10
  • Android基于OpenCV實(shí)現(xiàn)QR二維碼檢測(cè)

    Android基于OpenCV實(shí)現(xiàn)QR二維碼檢測(cè)

    QR碼比普通一維條碼具有快速讀取和更大的存儲(chǔ)資料容量,也無需要像一維條碼般在掃描時(shí)需要直線對(duì)準(zhǔn)掃描儀。因此其應(yīng)用范圍已經(jīng)擴(kuò)展到包括產(chǎn)品跟蹤,物品識(shí)別,文檔管理,庫(kù)存營(yíng)銷等方面。本文講解Android基于OpenCV實(shí)現(xiàn)QR二維碼檢測(cè)的步驟
    2021-06-06
  • Android實(shí)現(xiàn)QQ的第三方登錄和分享

    Android實(shí)現(xiàn)QQ的第三方登錄和分享

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)QQ的第三方登錄和分享,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • Android Service服務(wù)不被停止詳解及實(shí)現(xiàn)

    Android Service服務(wù)不被停止詳解及實(shí)現(xiàn)

    這篇文章主要介紹了Android Service服務(wù)不被停止詳解及實(shí)現(xiàn)的相關(guān)資料,有很多應(yīng)用在設(shè)置運(yùn)行中會(huì)被直接停止掉,這里就提供一個(gè)方法一直運(yùn)行,需要的朋友可以參考下
    2016-11-11

最新評(píng)論

湘乡市| 金塔县| 长春市| 东台市| 宿迁市| 余干县| 松潘县| 蓝田县| 太湖县| 浠水县| 通城县| 鹤壁市| 吴川市| 大石桥市| 白玉县| 万山特区| 方山县| 苏尼特左旗| 宜阳县| 资阳市| 江安县| 平舆县| 夏津县| 托克托县| 宁国市| 长治市| 于田县| 临汾市| 花莲县| 南皮县| 河南省| 天全县| 通化县| 鲜城| 镇原县| 铁力市| 秦皇岛市| 民权县| 公主岭市| 张掖市| 翁源县|