2011-08-24 2 views
3

성능을위한 안드로이드의 개발자 가이드를 읽었습니다.안드로이드 매뉴얼 할당 해제 오브젝트

대용량 객체를 만들면 (비싸다) 생성을 피할 수 없다는 것이 궁금 할뿐입니다. 논리적 인 것처럼 보입니다. 내가 끝낼 때 즉시 할당을 해제하려고합니다.

이렇게하는 방법이없는 것처럼 보입니다.

일부는 null로 설정하여 시스템에서 즉시 GC로 처리 할 것을 제안하지만, 이는 실제로 "즉각적인"것입니까? 시스템 (Dalvik VM)에 방금 null로 설정 한 큰 개체를 할당 해제하지 않을 옵션이있는 경우 null로 설정하는 것이 해결책이 아닙니다.

Null로 설정하면 ENCOURAGE 및 SPEED GC가 수행됩니까?

이 접근법은 Apps 성능을 최적화하는 "충분히 좋은"방법입니까? 또는 가능한 모든 경우에 추가 마일을 적용하여 안드로이드 장치에서 최고의 성능을 끌어낼 때마다 GC를 적용 할 가치가 있습니까?

+0

어떤 종류의 물건에 대해 이야기하고 있습니까? 그것의 비트 맵 당신은 recycle() 호출 할 수 있습니다; – NSjonas

+0

죄송합니다. 나는 그런 문제에 직면하고있는 상황이 아니라고 말 했어야합니다. 나는 일반적으로 Android 앱 디자인에 대해 신중히 생각하고 있으며 개발자로서 사용자에게 가능한 최상의 성능을 제공하기 위해 최선을 다 할 수있는 방법은 무엇입니까? 내가받은 답변은 매우 도움이되었으며 메모리가 일반적인 병목 지점 인 Android 앱 디자인에 대한 통찰력을주었습니다. 나는 이것을 주연 시켰고이를 이것을 참고로 유지할 것이다. 모두에게 감사드립니다. – Gapton

답변

4

gc가 호출 될 때 제어 할 수 없으므로 GC를 실행할 때 세밀한 세부 사항을 염려하지 않아도됩니다. gc()를 호출한다고해서 콜렉션이 보장되는 것은 아닙니다. System.gc()

에서 문서 당은 가비지 콜렉터를 실행하는 좋은 시간이 될 것이라고 가상 컴퓨터에 나타냅니다. 이것은 힌트 일뿐입니다. 가비지 컬렉터가 실제로 실행될 것이라는 보장은 없습니다. 내가보기 수행 대형 개체를 할당하고 이후 후 해당 객체의 라이프 사이클의 범위를 종료하면

  1. :

대형 개체 할당과 응용 프로그램을 개발에서 나는 대신 다음에 대해 걱정할 것 나중의 활동에서 GC에 의해 회수 되나요? 이것은 adb 쉘로 dumpsys meminfo를 실행하여 쉽게 확인할 수 있습니다. 기본적으로 메모리가 적절하게 가비지 수집 된 경우 할당 해제 후 큰 스파이크로 표시하고 이후에 삭제합니다.

  • 이 대형 객체의 GC 경로가 명확한 지 확인하십시오. hprof를 덤프하여이 객체의 참조 경로를 확인하고 메모리 분석기에서 확인하여이 작업을 수행 할 수 있습니다. 그렇다면 GC가 수집 할만큼 똑똑 할만큼 안전합니다.
  • 이 큰 개체를 할당 한 후 후속 작업을 실행하기에 충분한 힙에 패딩이 있습니까? 개체가 너무 큰 경우 GC가 수집 속도가 빠르지 만 (실제로이 점과 관련이 있습니다) 이전 작업에서 남은 작업과 결합 된 후속 작업의 메모리 소비가 실제로 발생할 수 있습니다 메모리 오류. GC에 대한 명확한 경로를 사용하여 null을 설정하면이 개체가 GC'ed 적절하게 얻을 수 있도록 도움이됩니다. 이것이 문제가된다고 인정하지만, 이것이 문제가된다면 내 생각에이 섹션이 어떻게 설계되었는지 다시 살펴보고 그것에 대한 최적화를 할 수 있는지 알아야 할 것입니다.
  • 필요에 따라 onDestroy를 통해 활동을 정리하고 적절하게 가비지 수집 될 수 있도록 활동을 다른 사용자가 참조하지 않는지 확인하십시오.예를 들어, 우리는 종종 활동 문맥에 참조를 보유한다는 사실을 잊어 버리는 경우가 많습니다. 비트 맵에서 recycle()을 호출하는 것 또한 도움이됩니다. 이 점을 기억하면 # 3의 경우 더 많은 공간을 준비하는 데 도움이됩니다.
  • +0

    매우 유익한 게시물, 고맙습니다. 내 앱에 최상의 성능을 제공하는 데 도움이되는 기술을 사용하겠습니다. – Gapton

    2

    대부분의 경우 안드로이드는 가비지 수집을 잘 처리합니다. 당신이 OutOfMemoryError를 받기 시작하지 않는다면 나는 그것에 대해 걱정하지 않을 것입니다.

    그러나 실제로 신경 쓰면 개체를 null로 설정 한 다음 System.gc()를 호출하면 해당 개체가 수집 될 가능성이 큽니다.

    +0

    이름에서 알 수 있듯이 시스템 전체에서 걸려온 전화입니다. 이것은 저렴한 조작이 아님을 의미합니까? 그럼 "장치에서 가장 성능을 쥐어 짜기"의 목적을 좀 꺾을 수 있습니다 – Gapton

    +0

    이 개체에 대해 얼마나 많은 메모리를 사용하고 있습니까? 얼마나 자주 system.gc()를 호출 하시겠습니까? 더 많은 정보없이 도움이되거나 방해가된다면 정말 말하기가 어렵습니다. 객체가 정말 크지 않다면 davlik GC로 처리 할 것입니다. – NSjonas