2011-03-09 113 views
0

這是我在Android中注意到的。如果您重新啓動手機,您會發現可用內存的數量更多[例如HTC Wildfire的190 MB)。隨着時間的推移,可用內存量不斷減少。Android內存泄漏?

[這個免費的內存,我指的是一個統計,我從一個TaskKiller應用程序獲得。我不信任這個應用程序來殺死我的其他應用程序,但用它來監視我的內存資源。]

是我的應用程序出了問題,或者在android中有內存問題[因爲想要更好的術語]。

如果是的話,我作爲開發人員可以阻止這種情況的發生。

+0

這是您正在使用的特定應用程序嗎?如果是這樣,那叫什麼? – SK9 2011-03-09 09:36:21

+0

那麼我有他們的負載安裝。我就是你可能稱之爲「極客」的人。 – 2011-03-09 09:46:54

+0

[Apps](http://www.appbrain.com/user/ANAND.SAINATH/apps-on-the-htc-wildfire)我在手機上有 – 2011-03-09 09:47:48

回答

3

我不認爲它們是「問題」,因爲Android是以應用程序在後臺工作的方式製作的。稱它爲多任務處理。這些應用程序會讓你記憶。 (我假設你指的是RAM大小)

當手機開始,幾乎所有的應用程序都在睡覺。慢慢地,後臺服務,如同步和其他啓動,他們開始佔用內存。

這就是爲什麼你看到可用內存下降的原因。我不認爲有什麼可擔心的,因爲Android很好地處理內存管理。

儘管作爲一名開發人員,您應該創建一個佔用內存儘可能少的應用程序。

0

Android有垃圾收集,所以在這個級別這些不是泄漏。你不必擔心。

+0

你知道你仍然可以泄漏內存嗎? GC只是釋放沒有任何引用的對象。如果您在某處有循環引用或其他引用,則GC不會像您所期望的那樣釋放它們... – WarrenFaith 2011-03-09 09:27:48

+0

是的,我知道。但這不是阿南德的問題。 – SK9 2011-03-09 09:29:01

+0

但是,這仍然屬於「我如何防止它成爲開發者」。請牢記這一點! – 2011-03-09 09:33:03

0

這可能是因爲你有一個正在泄漏內存的應用程序,但更普遍,出於性能考慮現代操作系統如Android往往會使用所有可用的內存作爲高速緩存存儲器,當一個應用程序需要它釋放出來。

  • 如果您正在運行內存和應用程序無法啓動,那麼你如果一個特定的應用程序使用這似乎是太多的內存可能有泄漏
  • ,那麼你可能有一個問題

只要你仍然可以運行,你需要,我就不會由於Android擔心應用程序是這樣做的工作。

作爲一個開發者,從理論上講,它很簡單 - 不使用更多的資源比你的需要,並釋放他們,當你與他們完成。但實際上,我們取得了不同程度的成功。

開發指南中的Application Resources部分是一個很好的開始,blog上通常有很好的文章。

1

Sheikh Aman在我打字的時候張貼了這篇文章,其中涵蓋了很多我要說的內容 - 特別是關於任何多任務,多進程系統通常以最小和隨時間開始,由於用戶inter其他-action組件將被裝起來從而減少可用的RAM等

至於實際的內存泄漏 - 這是對貧困碼所有系統可能導致他們所以要儘量避免這似乎顯示此行爲的應用程序。爲了避免造成他們自己,這是一個很好的文章,值得一讀...Avoiding Memory Leaks

1

我不知道你是否在你的應用程序與此有任何問題,但我已經創造了一滴溶液,修復所有標準Android課程android的內存泄漏問題:http://code.google.com/p/android/issues/detail?id=8488#c51

public abstract class BetterActivity extends Activity 
{ 
    @Override 
    protected void onResume() 
    { 
    System.gc(); 
    super.onResume(); 
    } 

    @Override 
    protected void onPause() 
    { 
    super.onPause(); 
    System.gc(); 
    } 

    @Override 
    public void setContentView(int layoutResID) 
    { 
    ViewGroup mainView = (ViewGroup) 
     LayoutInflater.from(this).inflate(layoutResID, null); 

    setContentView(mainView); 
    } 

    @Override 
    public void setContentView(View view) 
    { 
    super.setContentView(view); 

    m_contentView = (ViewGroup)view; 
    } 

    @Override 
    public void setContentView(View view, LayoutParams params) 
    { 
    super.setContentView(view, params); 

    m_contentView = (ViewGroup)view; 
    } 

    @Override 
    protected void onDestroy() 
    { 
    super.onDestroy(); 

    // Fixes android memory issue 8488 : 
    // http://code.google.com/p/android/issues/detail?id=8488 
    nullViewDrawablesRecursive(m_contentView); 

    m_contentView = null; 
    System.gc(); 
    } 

    private void nullViewDrawablesRecursive(View view) 
    { 
    if(view != null) 
    { 
     try 
     { 
     ViewGroup viewGroup = (ViewGroup)view; 

     int childCount = viewGroup.getChildCount(); 
     for(int index = 0; index < childCount; index++) 
     { 
      View child = viewGroup.getChildAt(index); 
      nullViewDrawablesRecursive(child); 
     } 
     } 
     catch(Exception e) 
     {   
     } 

     nullViewDrawable(view); 
    }  
    } 

    private void nullViewDrawable(View view) 
    { 
    try 
    { 
     view.setBackgroundDrawable(null); 
    } 
    catch(Exception e) 
    {   
    } 

    try 
    { 
     ImageView imageView = (ImageView)view; 
     imageView.setImageDrawable(null); 
     imageView.setBackgroundDrawable(null); 
    } 
    catch(Exception e) 
    {   
    } 
    } 

    // The top level content view. 
    private ViewGroup m_contentView = null; 
} 
+0

我不知道有關nullViewDrawableRecursive函數,但我認爲即使您調用System.gc()函數,它也只會將請求添加到垃圾回收器隊列中,並不保證釋放垃圾回收器。無論如何,非常感謝您的見解! – 2011-08-08 06:04:22

+0

我知道這很難相信,但嘗試一下,它就像一個魅力! :) – swinefeaster 2011-08-08 07:23:49