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

首頁 > 系統 > Android > 正文

Android 內存泄漏的幾種可能總結

2019-12-12 05:19:06
字體:
來源:轉載
供稿:網友

Java是垃圾回收語言的一種,其優點是開發者無需特意管理內存分配,降低了應用由于局部故障(segmentation fault)導致崩潰,同時防止未釋放的內存把堆棧(heap)擠爆的可能,所以寫出來的代碼更為安全。

不幸的是,在Java中仍存在很多容易導致內存泄漏的邏輯可能(logical leak)。如果不小心,你的Android應用很容易浪費掉未釋放的內存,最終導致內存用光的錯誤拋出(out-of-memory,OOM)。

一般內存泄漏(traditional memory leak)的原因是:當該對象的所有引用都已經釋放了,對象仍未被釋放。(譯者注:Cursor忘記關閉等)

邏輯內存泄漏(logical memory leak)的原因是:當應用不再需要這個對象,當仍未釋放該對象的所有引用。

如果持有對象的強引用,垃圾回收器是無法在內存中回收這個對象。

在Android開發中,最容易引發的內存泄漏問題的是Context。比如Activity的Context,就包含大量的內存引用,例如View Hierarchies和其他資源。一旦泄漏了Context,也意味泄漏它指向的所有對象。Android機器內存有限,太多的內存泄漏容易導致OOM。

檢測邏輯內存泄漏需要主觀判斷,特別是對象的生命周期并不清晰。幸運的是,Activity有著明確的生命周期,很容易發現泄漏的原因。Activity.onDestroy()被視為Activity生命的結束,程序上來看,它應該被銷毀了,或者Android系統需要回收這些內存(譯者注:當內存不夠時,Android會回收看不見的Activity)。

如果這個方法執行完,在堆棧中仍存在持有該Activity的強引用,垃圾回收器就無法把它標記成已回收的內存,而我們本來目的就是要回收它!
結果就是Activity存活在它的生命周期之外。

Activity是重量級對象,應該讓Android系統來處理它。然而,邏輯內存泄漏總是在不經意間發生。(譯者注:曾經試過一個Activity導致20M內存泄漏)。在Android中,導致潛在內存泄漏的陷阱不外乎兩種:

1.全局進程(process-global)的static變量。這個無視應用的狀態,持有Activity的強引用的怪物。

2.活在Activity生命周期之外的線程。沒有清空對Activity的強引用。

檢查一下你有沒有遇到下列的情況。

Static Activities

在類中定義了靜態Activity變量,把當前運行的Activity實例賦值于這個靜態變量。
如果這個靜態變量在Activity生命周期結束后沒有清空,就導致內存泄漏。因為static變量是貫穿這個應用的生命周期的,所以被泄漏的Activity就會一直存在于應用的進程中,不會被垃圾回收器回收。

  static Activity activity;  void setStaticActivity() {   activity = this;  }  View saButton = findViewById(R.id.sa_button);  saButton.setOnClickListener(new View.OnClickListener() {   @Override public void onClick(View v) {    setStaticActivity();    nextActivity();   }  });


Memory Leak 1

主站蜘蛛池模板: 三穗县| 南安市| 兴业县| 四平市| 车险| 安宁市| 怀柔区| 西丰县| 通州市| 星子县| 大安市| 大城县| 冀州市| 清远市| 苍山县| 涡阳县| 南丹县| 沙河市| 新野县| 勐海县| 罗城| 南京市| 安陆市| 千阳县| 禄丰县| 信阳市| 佛山市| 峨边| 炎陵县| 平度市| 连云港市| 延寿县| 永登县| 泰宁县| 桐梓县| 中西区| 酉阳| 宜章县| 阿坝县| 甘谷县| 洛川县|