Dalvik 메모리

dvmGcStartup


친구가 작은 도구tree를 소개했는데 이것은 문자 모드에서 디렉터리와 파일을 트리 형식으로 나타낼 수 있는 것이다.tree로 vm/디렉터리에 있는 모든 하위 디렉터리와 파일을 열거하면 GC가 있습니다.h는 vm/alloc/디렉터리에 있습니다.이것이 바로 우리가 필요로 하는 것이다.GC에서h에서 10개의 function의 정의를 볼 수 있습니다. 임의로 연구를 선택하면 첫 번째 function dvmCollect Garbage()가 됩니다.dvmCollectGarbage()는 vm/alloc/Alloc에 있습니다.c 파일에.편집기의folding 기능을 이용하여 모든function을 열거하고 빠르게 한 번 훑어보십시오.dvmGcStartup () 이 function은 반짝반짝 빛난다. Startup 키워드를 보면 자신도 모르게 어떻게 시작하는지 보러 가야 한다.
#!cpp
bool dvmGcStartup(void)
{
    dvmInitMutex(&gDvm.gcHeapLock);

    return dvmHeapStartup();
}

내용은 간단합니다. initialize에만 mutex와 dvmHeapStartup () 호출이 있습니다.dvmHeapStartup()은 heap의 초기화 동화로 메모리를 분배하고 관리합니다.Heap은 궁금하지만 dvmGcStartup () 이 혼원태초에 호출되었는지 확인하는 것이 좋습니다.화안금정 grep를 불러 한 번 탐색해 보니, grep의 두 눈은 붉은 빛, 번개 천둥 사이에서 vm/Init를 발견하였다.c 호출이 큽니다.그래서 촉매 탑승자 구천신우 Emacs, 빨리 Init로 오세요.c, dvmGcStartup()이 나타나는 위치를 일일이 검사합니다.그 중에서 dvmStartup () 에서는 dvmGcStartup () 을 호출하는 것 외에 많은 dvmXXStartup () 을 호출합니다.이것은 또한 코딩의 통칙으로 가능한 한 기능이 유사한 기호를 같은 형식의 이름으로 한다.그러나 저는 Dalvik가 Startup을 사용하는 것이 Init보다 직감적이고 통용되지 않는다고 생각합니다.분명히 dvmStartup()은 Dalvik가 일부 서브시스템을 집중적으로 초기화하는 곳일 것이다.dvmStartup() 호출 위치를 확인하면 익숙한 기호를 볼 수 있습니다. JNI_CreateJavaVM().Create Dalvik VM 환경의 기능입니다.

Heap


나중에 Heap을 보면 GC는 반드시 Heap와 관련이 있을 것이다. 먼저 Heap를 보면 GC를 이해하는 데 도움이 될 것이다.dvmGcStartup () 에서 dvmHeapStartup () 을 호출하면 들어가서 한 번 볼 수밖에 없습니다.
dvmHeapStartup()의 동작은 대개
  • dvmHeapSourceStartup()에 의해 GcHeap을 생성합니다
  • assign gDvm.gcHeap은 면의 object입니다
  • dvmHeapInitHeapRefTable()
  • dvmInitializeHeapWorkerState()

  • HeapWorker가 무엇인지, HeapSource가 무엇인지 알 수 없는 낯선 명사가 여러 개 나왔다.가장 좋은 방법은 실제 연구를 하는 것이다.

    HeapSource


    dvmHeapSourceStartup () 에서 mspace () 를 호출하여 mspace를 구축하고 mspace를 allocate 메모리로 사용하는 것을 볼 수 있습니다.mspace_alloc()
    #!cpp
        /* Create an unlocked dlmalloc mspace to use as                             
         * the small object heap source.                                            
         */
        msp = createMspace(startSize, absoluteMaxSize, 0);
        if (msp == NULL) {
            return false;
        }
    
        /* Allocate a descriptor from the heap we just created.                     
         */
        gcHeap = mspace_malloc(msp, sizeof(*gcHeap));
    

    따라서 mspace는 Dalvik이 메모리를 관리하는 메커니즘이다.하면, 만약, 만약...malloc, 진흙소가 물에 들어간 것처럼 아무것도 찾을 수 없어요.그러나 앞의 주석에dlmalloc가 언급되어 있습니다. 검색 엔진을 통해dlmalloc가 사실Doug Lea에서 만든 주석명memory allocator라는 것을 발견할 수 있습니다.mspace는 사실dlmalloc에서 분배할 수 있는 메모리 범위를 관리하고 설정하는 데 쓰인다.createMspace () 가 전송한 두 개의 매개 변수는 공간의 크기를 설정하는 것입니다. dlmalloc는 시스템에서 이 공간을 자동으로 설정합니다.
    Dalvik는 dlmalloc를 사용하지만 다른 층을 아웃소싱했습니다.좋은 점은 미래에dlmalloc를 언제든지 바꿀 수 있다는 것이다. 필요하다면.Dalvik용
  • GcHeap
  • HeapSource
  • Heap

  • 메모리 관리를 포장하고 제공합니다.Heap은 사실 HeapSource의 한 칸입니다. HeapSource:::heaps
        /* The heaps; heaps[0] is always the active heap,                           
         * which new objects should be allocated from.                              
         */
        Heap heaps[HEAP_SOURCE_MAX_HEAP_COUNT];
    

    하나의 HeapSource가 여러 개의 Heap을 가질 수 있는 것은 사실상 세 가지입니다.사용할 때, allocate 메모리에 영원히 첫 번째 것을 사용합니다.addNewHeap()은 새로 추가된 mspace를 첫 번째 Heap에 영원히 추가하고, 원래 Heap의 내용은 한 위치로 뒤로 이동합니다.dvmHeapSourceStartup () 은 새로운 mspace를 만든 후 addNewHeap () 를 호출하여 HeapSource에 가입합니다.
    dvmHeapSourceStartup()create GcHeap, HeapSource, Heap, mspace 각각 1.GcHeap에는 pointer GcHeap::heapSource가 HeapSource를 가리키고, HeapSource::heaps는 앞에서 말한 바와 같다.Heap 관리 mspace는 시작 주소 (baseaddress) 와 공간 크기로 이 공간을 지정하는 연속적인 분배 가능한 공간입니다.Heap에서 메모리를 분배할 때마다 Heap:::objectBitmap에서 Heap의 상대적인 위치가 GC가 관리하는object가 있는지 표시합니다.실제로 메모리의 분배는 dlmalloc가 처리한다, HeapSource.c의countallocation()은 Heap::objectBitmap에 표시를 해서 이 블록의 위치를 추적하고 메모리가 사용하는 상황을 기록합니다.
    HeapSource.c리
  • dvmHeapSourceAlloc()
  • dvmHeapSourceAllocAndGrow()

  • HeapSource:::heaps[0].msp(mspace)는 공간을 분배하고countallocation()을 호출하여 위치를 표시하여 GC를 회수할 수 있도록 합니다.Dalvik 시스템은 vm/alloc/디렉터리 아래의 다른 모듈을 제외하고는 vm/alloc/Heap를 호출합니다.c의 dvmMalloc () 는 메모리를 구성합니다.
    Heap:::objectBitmap은 블록 연속 기억체로 각각bit는 8bytes 단위의 블록을 대표한다.만약object가 mspace 시작 위치에서 n개의 8bytes에서 떨어지면 n번째bit를 표시합니다.

    Garbage Collection


    dvmMalloc () 에서 메모리 부족을 발견하면 dvmCollectGarbage Internal () 을 호출하여 메모리 회수를 시작합니다.회수 알고리즘의 주요 논리는 복잡하지 않다.
  • dvmHeapBeginMarkStep()
  • 새로운 비트맵을 설정합니다

  • dvmHeapMarkRootSet()
  • 모든 root object를 표시합니다

  • dvmHeapScanMarkedObjects()
  • 표시된object를 스캔하여 다른 표시하지 않은object에reference가 있는지 확인하고 표시를 추가합니다..
  • 새로운 오브젝트가 발견되지 않을 때까지..

  • dvmHeapFinishMarkStep()
  • 새로운 비트맵과 원래 힙에 있는 비트맵을 비교한다
  • Heap::objectBitmap에 표시되어 있지만 새 bitmap에 나타나지 않는object..


  • dvmHeapScanMarkedObjects()는 dvmHeapBitmapWalkList()를 통해 dvmHeapMarkRootSet()에 표시된 object에 대한 1차 스캔입니다.dvmHeapBitmapWalkList () 는 매개 변수가 전송된callback을 호출하여 새로 발견한object를 스캔하여stack에 추가합니다.dvmHeapScanMarkedObjects() 호출 processMarkStack() 처리 stack의object.processMarkStack () 이 stack에 있는object를 처리할 때, 새로 발견된 물건이 이 stack에 추가됩니다.processMarkStack () 은 stack pop object에서 stack을 비울 때까지 reference가 표시되지 않은 항목을 검사합니다.Object를 검사하는 레퍼런스는 Mark Sweep입니다.c의 scanObject()에서 진행합니다.scanObject()는 object의 모든 칸에 reference의 물건이 아직 표시되지 않았는지 검사합니다.
    Dalvik는 메모리 관리에 있어서 매우 단순하다. 심지어는object의 Reuse도 없다.그래서generation의 디자인도 없다.현재도 주기적인 스캔을 하지 않고 부족할 때까지 스캔을 시작한 것 같다.많은 곳에서 나타나지만 사실 Dalvik는 많은 디자인을 쫓아냈고 미래에는 아직도 많은 개선 공간이 있다.

    결론


    엄밀히 보면 Dalvik은 작은 시스템이라고 할 수 있다.시작은 작은 시스템이므로trace 구석구석에도 시간이 걸린다.가장 중요한 것은 전체sorucetree의 주요 구조를 파악하는 것이다. 다음은 수시로 알고 싶거나 알고 싶은 부분에 대해 상세한 탐색을 할 수 있다.sorucetree의 가장 좋은 방법은 시스템의 일부 기초 설계, 예를 들어 메모리 관리,main()function이 실행하는 주요 절차 등을 이해하는 것이다.다른 디자인은 사전을 뒤지는 것과 같고, 필요할 때sorucetree에 대한 익숙함에 의존하면 그 내용을 빠르게 추적할 수 있다.
    또한trace에서main()function의 주요 절차에 다음followchart를 그릴 수 있으며, 이후trace에서 지도를 안내할 때 묘용이 무궁무진합니다.

    좋은 웹페이지 즐겨찾기