當前位置:編程學習大全網 - 源碼下載 - Android技術分享

Android技術分享

內存泄漏:

例如:

請註意,下面的例子是虛構的。

內存抖動

從Android文檔中的內存抖動這個詞,中文翻譯過來就是內存抖動。

指快速頻繁地創建對象所導致的性能問題。

引用原Android文檔:

Java內存泄漏的根本原因是長壽命對象持有對短壽命對象的引用,這很可能導致內存泄漏。

雖然不再需要短生命周期對象,但因為長生命周期仍然持有其引用,所以無法回收,從而導致內存泄漏。

靜態集合類導致的內存泄漏

如果只釋放引用本身(tO = null),ArrayList仍然引用該對象,GC不能回收它。

音頻監視器

在Java應用中,通常會用到很多監聽器,壹般是通過addXXXXListener()實現的。但是,在釋放對象時,通常會忘記刪除偵聽器,這增加了內存泄漏的風險。

各種聯系

例如數據庫連接、網絡連接(套接字)和I/O連接。忘記顯式調用close()方法導致的內存泄漏。

對內部類和外部模塊的引用

對內部類的引用很容易被遺忘,壹旦不釋放,後續的壹系列對象可能都不會被釋放。此外,還要小心外部模塊的無意引用,以及內部類是否提供相應的操作來移除外部引用。

單壹模式

由於單例的靜態特性,其生命周期和應用程序壹樣長,如果使用不當很容易導致內存泄漏。如果李善持有外部引用,需要註意提供釋放方法,否則當外部對象無法正常回收時,會導致內存泄漏。

設置類泄漏

如果集合的使用範圍超出了邏輯代碼的範圍,就要特別註意刪除機制是否完善可靠。例如由靜態屬性static指向的集合。

簡單利潤泄漏

下面是壹個簡單的邏輯代碼,只是為了說明內存泄漏問題,並不保證簡單受益模式的可靠性。

創建AppManager時,需要傳入壹個上下文,這個上下文的生命周期非常重要。

1.如果傳入應用程序的上下文,就沒有問題,因為應用程序的生命周期等於應用程序的生命周期。

2.如果傳入了活動的上下文,妳就需要考慮這個活動在整個生命周期中是否不會被回收。如果沒有,就會造成內存泄漏。

由非靜態內部類創建的靜態實例導致的內存泄漏

內部類應該單獨打包成單例來使用。

匿名內部類/異步線程

Runnable使用壹個匿名內部類,並將保存壹個對MyActivity的引用。如果在活動被銷毀之前任務沒有完成,活動的內存將不會被回收,從而導致內存泄漏。

解決方案:分離Runnable或者使用靜態內部類,避免因持有外部對象而導致的內存泄漏。

處理程序導致的內存泄漏

Handler屬於TLS(線程本地存儲)變量,其生命周期與Activity不壹致,容易導致持有對象的不正確釋放。

當Android應用程序啟動時,應用程序的主線程會自動創建壹個Looper對象及其關聯的MessageQueue。

當壹個Handler對象在主線程中被實例化時,它將自動與主線程Looper的MessageQueue相關聯。發送到MessageQueue的所有消息都將包含對處理程序的引用,因此Looper將相應地回調處理程序的handleMessage()方法來處理消息。只要MessageQueue中有未處理的消息,Looper就會取出來交給Handler處理。

此外,主線程的Looper對象將伴隨應用程序的整個生命周期。

在Java中,非靜態內部類和匿名內部類都有可能包含對它們所屬的外部類的引用,但靜態內部類沒有。

當活動被finish()丟棄時,延遲任務執行的消息仍然會存在於主線程中,它持有活動的處理程序引用,所以finish()丟棄的活動此時不會被回收,這樣會造成內存泄漏(因為處理程序是非靜態的內部類,所以會持有外部類的引用,這裏指的是SampleActivity)。

避免不必要的靜態成員變量。

資源的使用,如BroadcastReceiver、ContentObserver、文件、光標、流、位圖等。應在活動被破壞前及時關閉或取消。

當不使用WebView對象時,應該調用destroy()方法來銷毀它。

  • 上一篇: Android中的壹些內存泄漏實例及解決方案
  • 下一篇:壹下哪類跑腿服務
  • copyright 2024編程學習大全網