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

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

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

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

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

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

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

  JVM進行次GC的頻率很高,但因為這種GC占用時間極短,所以對系統(tǒng)產生的影響不大。更值得關注的是主GC的觸發(fā)條件,因為它對系統(tǒng)影響很明顯??偟膩碚f,有兩個條件會觸發(fā)主GC:
 ?、佼攽贸绦蚩臻e時,即沒有應用線程在運行時,GC會被調用。因為GC在優(yōu)先級最低的線程中進行,所以當應用忙時,GC線程就不會被調用,但以下條件除外。

 ?、贘ava堆內存不足時,GC會被調用。當應用線程在運行,并在運行過程中創(chuàng)建新對象,若這時內存空間不足,JVM就會強制地調用GC線程,以便回收內存用于新的分配。若GC一次之后仍不能滿足內存分配的要求,JVM會再進行兩次GC作進一步的嘗試,若仍無法滿足要求,則 JVM將報“out of memory”的錯誤,Java應用將停止。

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

3.減少GC開銷的措施

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

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

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

  (2)盡量減少臨時對象的使用

  臨時對象在跳出函數調用后,會成為垃圾,少用臨時變量就相當于減少了垃圾的產生,從而延長了出現(xiàn)上述第二個觸發(fā)條件出現(xiàn)的時間,減少了主GC的機會。

  (3)對象不用時最好顯式置為Null

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

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

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

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

  基本類型變量占用的內存資源比相應對象占用的少得多,如果沒有必要,最好使用基本變量。

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

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

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

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

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

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

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

乍一看這個函數似乎是可以進行垃圾回收的,可事實并不是那么簡單。

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

那么下一個問題就是:gc()進行回收的準則是什么?也就是說什么樣的對象可以被回收?

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

比如說:

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

看一下這段代碼:

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

這個時候,雖然變量c指向的對象有c 以及b.v指向它,但是它們都已經不可達了,為什么?因為唯一可以找到它們的是a.v,但是現(xiàn)在a.v指向了d,所以他們就是不可達的了。
理由也很直觀:沒有任何可達變量指向你,你還有活下去的理由嗎?你就算活下去誰能找得到你呢?

所以說,C++中將釋放了的指針置為null的習慣要保留到Java中,因為這有可能是你釋放內存的唯一途徑。

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

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

應用程序對資源操作,通常簡單分為以下幾個步驟:

1、為對應的資源分配內存

2、初始化內存

3、使用資源

4、清理資源

5、釋放內存

應用程序對資源(內存使用)管理的方式,常見的一般有如下幾種:

1、手動管理:C,C++

2、計數管理:COM

3、自動管理:.NET,Java,PHP,GO…

但是,手動管理和計數管理的復雜性很容易產生以下典型問題:

1.程序員忘記去釋放內存

2.應用程序訪問已經釋放的內存

產生的后果很嚴重,常見的如內存泄露、數據內容亂碼,而且大部分時候,程序的行為會變得怪異而不可預測,還有Access Violation等。

.NET、Java等給出的解決方案,就是通過自動垃圾回收機制GC進行內存管理。這樣,問題1自然得到解決,問題2也沒有存在的基礎。

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

相關文章

  • Android序列化XML數據

    Android序列化XML數據

    有時候一些項目中需要傳遞一些XML格式的數據,如何把一個對象序列化為XML格式,本文就講講Android序列化XML數據的方法
    2013-11-11
  • Android動畫之漸變動畫(Tween Animation)詳解 (漸變、縮放、位移、旋轉)

    Android動畫之漸變動畫(Tween Animation)詳解 (漸變、縮放、位移、旋轉)

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

    Android 插件化處理方案詳解

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

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

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

    android實用工具類分享(獲取內存/檢查網絡/屏幕高度/手機分辨率)

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

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

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

    Android ViewPager的MVP架構搭建過程

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

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

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

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

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

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

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

最新評論

诏安县| 洪江市| 巫山县| 西藏| 杂多县| 肃宁县| 无锡市| 句容市| 那坡县| 鹤峰县| 文登市| 虹口区| 石楼县| 秦皇岛市| 阳曲县| 家居| 巴南区| 应城市| 临汾市| 姚安县| 长寿区| 黄浦区| 清涧县| 苍溪县| 余姚市| 沙湾县| 贵州省| 陇川县| 宁武县| 枝江市| 西和县| 莱州市| 丽江市| 舞钢市| 司法| 济宁市| 石嘴山市| 宕昌县| 上虞市| 南澳县| 西林县|