Android Native Heap Size

Android Native Heap Size








Android에서 Memory는 크게 VM Heap Size와 Native Heap Size로 나뉩니다.





CTS관련해서 Gingerbread CDD 문서에 보면 Android VM Memory에 대한 항목이 있습니다.








Device implementations with screens classified as medium- or low-density MUST configure


Dalvik to allocate at least 16MB of memory to each application. Device implementations


with screens classified as high-density or extra-high-density MUST configure Dalvik


to allocate at least 24MB of memory to each application.


Note that device implementations MAY allocate more memory than these figures.






위의 규정에 의하면, Dalvik에서 각각의 애플리케이션에게 메모리 할당을 보장해 주어야 하는 크기는 최소 16M입니다. 하지만,


스크린 density에 따라 24M 까지 보장해야 한다는 말입니다.




Dalvik 상에서 메모리 할당이란 차원에서 이는 Dalvik에서 사용가능한 heap이라고 정의해도 무방할 듯 합니다.


하지만 이것은 최소 요구사항이고 실제 각각의 디바이스에서 제공하는 heap Size를 알기 위해서는 다음과 같은 메쏘드를 사용해서 그 값을 체크해 볼 수 있습니다.











ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);

int heapSize = am.getMemoryClass();





더불어, 안드로이드 3.1(HoneyComb)에서는 좀 더 큰 heap을 사용할 수 있는 구조를 지원하고


있는데, 이를 사용하기 위해서는 다음과 같은 방식으로 사용할 수 있습니다.












– AndroidManifest.xml에 android:largeHeap=”true”추가한다. (Android ICS부터 default 속성)



또는




– ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);


int largeHeapSize = am.getLargeMemoryClass();






지금까지의 내용은 전부 Dalvik heap과 관련된 제약(또는 최소요구사항)을 의미합니다.


그렇기 때문에 만약 NDK를 사용해서 shard library를 만들고 그 내부에서 malloc()을 수행한다면 이는 Dalvik에 의해 관리되는 메모리 범위 밖에 존재하게 됩니다.




그러므로 위의 메모리 제약의 제어범위 밖에 놓이게 되고 디바이스가 허용하는 최대 메모리까지 할당 가능합니다.







더불어 안드로이드는 하나의 Process가 하나의 Dalvik VM을 가지기 때문에 위의 제약은 프로세스내의 Dalvik VM 상의 heap 크기에 대한 제약을 의미합니다.




또한 NDK를 통해 malloc()통해 사용되는 메모리는 해당 프로세스 내의 heap을 의미합니다.


32bit 머신에서 개별 프로세스에 부여되는 Virtual Memory 어드레스는 4G이지만, 실제 Physical Memory와 swap지원 여부에 따라 NDK에서 malloc()을 통해 할당할 수 있는 heap 크기는 디바이스별로 다를 수 있습니다.








즉 Dalvik heap은 Process내에서 max size 제약이 있다면, Native heap은 Linux kernel에 의해 관리되는 system wide한 heap내에서 제약을 갖는다고 보시면 됩니다.


 


 



ActivityManager am
= (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);


ActivityManager.MemoryInfo mi = new ActivityManager.MemoryInfo();
am.getMemoryInfo(mi);
Log.i(“HEAP”, “avaialble : ” + Long.toString(mi.availMem));

위의 MemoryInfo의 availMem은 Kernel에서 지원하고 있는
현재 사용가능한 heap입니다.


 


 


Virtual Machine Compatibility

Screen Size : Screen Density : Application Memory
small / normal / large ldpi / mdpi 16MB
small / normal / large hdpi / xhdpi 32MB
xlarge mdpi 32MB
xlarge hdpi / xhdpi 48MB


 


 


출처: http://lsit81.tistory.com/59


 

댓글 남기기