2012-02-28 3 views
6

복잡한 장면을 설정하기 위해 상당한 양의 메모리를 사용하는 OpenGL Android 앱이 있는데, 이로 인해 심각한 힙 조각화가 발생합니다. 메모리 누수가 없더라도 조각화로 인해 메모리가 부족한 상태에서 앱을 파괴하고 만들 수는 없습니다.Android 힙 조각화 전략?

안드로이드는 분명히 활동을 중단시키는 동일한 VM/힙에서 활동을 파괴하고 생성하는 습관을 가지고 있기 때문에 큰 문제를 야기합니다 (즉, 분열은 누설이 아닌 문제입니다).

@Override 
protected void onStop() { 
    super.onStop(); 
    if(isFinishing()) { 
     System.runFinalizersOnExit(true); 
     System.exit(0); 
    } 
} 

이 활동이 마무리 될 때하는 완전한 VM 종료됩니다, 따라서 다음 번에이 활동은 신선한 조각 나지 않은 힙를 얻을 시작되었는지 보장이에 대응하기위한 전략으로 나는 다음과 같은 기술을 사용했다.

참고 :이 방법은 "Android 방식"이 아니지만 가비지 수집기가 비 압축이므로 주어진 힙을 계속 재사용하는 것은 불가능합니다.

이 techinque는 실제로 일반적으로 작동하지만 비 활동 모드에서 활동이 삭제 된 다음 다시 생성되면 작동하지 않습니다.

아무도 힙 분해를 처리하는 방법에 대한 좋은 제안이 있습니까?

추가 참고 : 메모리 소비량을 줄이는 것은 실제로 옵션이 아닙니다. 액티비티는 실제로 많은 양의 메모리를 사용하지 않지만 힙 (및 원시 힙)은 아마도 일부 대형 메모리 덩어리로 인해 쉽게 조각난 것처럼 보입니다.

+0

나는 동일한 문제가 있었고 비슷한 해결책을 사용했습니다. 정말 끔찍해. –

답변

4

조각화는 거의 항상 조건부 할당의 결과입니다 무늬. 대형 오브젝트는 자주 작성되고 소멸됩니다. 더 작은 객체와 함께 지속될 수 있습니다 (또는 적어도 수명이 다름) - 힙의 구멍이 만들어집니다.

이러한 시나리오에서 작동하는 단편화 방지는 특정 할당 패턴을 방지하는 것입니다. 이것은 대용량 객체를 풀링하여 수행 할 수 있습니다. 성공한 경우 응용 프로그램이 감사하게도 실행 속도가 훨씬 빨라짐을 인정합니다.

@edit : 아직 더 구체적으로 질문 : 응용 프로그램을 다시 시작한 후에 힙이 아직 비어 있지 않은 경우 힙에 남아있는 부분은 무엇입니까? 당신은 메모리 누수의 문제가 아니라 그것이 무엇인지를 확인했습니다. OpenGL을 사용하고 있기 때문에 OpenGL 리소스가 제대로 처리되지 않았기 때문에 일부 기본 래퍼가 남아있을 수 있습니까?