2011-03-09 5 views
0

이것은 Android에서 내가 눈치 챈 것입니다. 휴대 전화를 다시 시작하면 사용 가능한 메모리의 양이 [HTC Wildfire의 경우 190MB]가됩니다. 시간이 지남에 따라 여유 메모리의 양은 줄어들지 않습니다.안드로이드에서 메모리 누수가 발생 했습니까?

[이 무료 메모리는 TaskKiller 앱에서 가져온 통계입니다. 나는이 응용 프로그램이 내 다른 응용 프로그램을 죽일 신뢰하지만 내 메모리 자원을 모니터링하는 데 사용하지 마십시오.]

내가 사용하고있는 응용 프로그램에 문제가 있거나 안드로이드에 메모리 문제가 있습니까 [더 나은 용어를 원함 ].

그렇다면 개발자로서 어떻게하면 이런 일이 일어나지 않게 할 수 있습니다.

+0

을 이 앱은 사용중인 앱입니까? 그렇다면 무엇이라고 부릅니까? – SK9

+0

글쎄, 나는 그들 중 많은 수가 설치되어있다. 나는 당신이 "괴짜"라고 부르는 것입니다. –

+0

내 휴대 전화에있는 [Apps] (http://www.appbrain.com/user/ANAND.SAINATH/apps-on-the-htc-wildfire) –

답변

3

안드로이드는 응용 프로그램이 백그라운드에서 작동하는 방식으로 만들어지기 때문에 나는 그들을 "이슈"로 간주하지 않습니다. 그것을 멀티 태스킹이라고 부르십시오. 이러한 응용 프로그램은 메모리 비용이 듭니다. (나는 당신이 RAM 크기를 언급하고 있다고 가정하고있다)

전화가 시작되면 거의 모든 응용 프로그램이 잠자고있다. 천천히, sync와 같은 백그라운드 서비스가 시작되고, 그들은 메모리를 차지하기 시작합니다.

그런 이유로 사용 가능한 메모리가 감소합니다. 안드로이드는 메모리 관리를 잘 처리하기 때문에 걱정할 것이 없다고 나는 생각하지 않는다.

개발자는 가능한 한 적은 메모리를 차지하는 앱을 만들어야합니다.

0

Android에는 가비지 수집이 있으므로이 수준에서는 누출이 아닙니다. 걱정할 필요가 없습니다.

+0

아직도 메모리가 누출 될 수 있다는 것을 알고 계십니까? GC는 참조가 더 이상없는 개체 만 사용합니다. 어딘가에 순환 참조 또는 다른 참조가있는 경우 GC는 예상대로 메시지를 해제하지 않습니다. – WarrenFaith

+0

예. 알고 있습니다. 그러나 이것은 아난드의 질문이 아닙니다. – SK9

+0

하지만 여전히 "개발자로 어떻게 막을 수 있습니까?"라는 범주에 속합니다. 그것을 명심하십시오! –

0

메모리 누수가있는 앱이 있지만 일반적으로 성능상의 이유로 안드로이드와 같은 최신 운영 체제는 사용 가능한 모든 메모리를 캐시 메모리로 사용하는 경향이 있으며, 앱이 필요할 때이를 해제하는 경향이 있습니다. 특정 응용 프로그램이 너무 많은 메모리로 보이는 사용하는 경우 메모리가 부족하고 애플 리케이션을 시작할 수없는 경우

  • , 당신은 누출
  • 이있을 수 있습니다, 당신은 문제가있을 수 있습니다

필요한 앱을 계속 실행할 수 있다면 안드로이드가 그 일을하고 있기 때문에 걱정할 필요가 없습니다.

개발자는 이론적으로 간단합니다. 필요한 것보다 많은 리소스를 사용하지 말고 완료되면 풀어주십시오. 그러나 실제로는 다양한 수준의 성공을 거두고 있습니다.

dev 안내서의 Application Resources 섹션은 시작하기에 좋은 장소이며 일반적으로 blog에 좋은 기사가 있습니다.

1

셰이크 아만 (Sheikh Aman)은이 질문을 입력하면서 내가 말하고자하는 내용을 많이 다루었습니다. 특히 멀티 태스킹, 멀티 프로세스 시스템이 일반적으로 최소 및 시간이 경과함에 따라 사용자 간 - 다른 구성 요소가로드되어 무료 RAM 등을 줄일 수 있습니다.

실제 메모리 누수는 모든 시스템에서 불량 코드로 인해 발생할 수 있으므로이 동작을 표시하는 것으로 보이는 앱을 피하십시오. 그들 자신을 일으키는 것을 피하기 위해서, 이것은 읽을 가치가있는 훌륭한 기사입니다 ...Avoiding Memory Leaks

1

앱이 어떤 문제가있는 경우 나도 몰라,하지만 난 표준 안드로이드 클래스를 가진 모든 안드로이드 메모리 누수 문제 해결 솔루션 하락 만들었습니다 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() 함수를 호출하더라도 가비지 수집기 큐에 요청을 추가하고 가비지 수집기를 해제하지는 않는다고 생각했습니다. 어쨌든, 통찰력을위한 많은 감사합니다! –

+0

믿기 어렵지만 시도해보십시오. 매력처럼 작동합니다! :) – swinefeaster

관련 문제