4

これは、私が使用しているコードの簡略化されたバージョンです

ジャワ:

private native void malloc(int bytes);
private native void free();

// this is called when I want to create a very large buffer in native memory
malloc(32 * 1024 * 1024);

// EDIT: after allocating, we need to initialize it before Android sees it as anythign other than a "reservation"
memset(blob, '\0', sizeof(char) * bytes);


...

// and when I'm done, I call this
free()

子:

static char* blob = NULL;

void Java_com_example_MyClass_malloc(JNIEnv * env, jobject this, jint bytes)
{

    blob = (char*) malloc(sizeof(char) * bytes);

    if (NULL == blob) {
    __android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG, "Failed to allocate memory\n");
    } else {
        char m[50];
        sprintf(m, "Allocated %d bytes", sizeof(char) * bytes);
        __android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG, m);
    }
}

void Java_com_example_MyClass_free(JNIEnv * env, jobject this)
{
    free(blob);
    blob = NULL;
}

ここで、MyClass.java から malloc() を呼び出すと、32M のメモリが割り当てられ、使用可能なメモリがどこかで減少していることを確認できるはずです。adb shell dumpsys meminfoただし、またはのいずれかで、その兆候は見られませんでしたadb shell cat /proc/meminfo。私は C の初心者ですが、Java の経験は豊富です。テスト目的で、Dalvik のヒープの外に大量のメモリを割り当てようとしています (したがって、Android/dalvik によって管理されません)。Hackbod のおかげで、現在 Android はネイティブ コードに割り当てられているメモリの量に制限を設けていないので、これが正しいアプローチのようです。私はこれを正しく行っていますか?

4

1 に答える 1

3

の後に「プライベート/ダーティ」ページの増加が見られるはずmemset()です。追加の開発者コマンドライン ユーティリティがデバイスにインストールされている場合は、実行するprocrankshowmap <pid>、これを簡単に確認できます。ルート化されたデバイスが必要です。

/proc/self/mapsそれができない場合は、割り当ての前後にの内容をファイルにコピーします。(最も簡単なのは、外部ストレージに書き込むことですWRITE_EXTERNAL_STORAGE。マニフェストで許可が必要です。) マップ出力を比較すると、新しい 32 MB リージョン、または 32 MB 拡張された既存のリージョンのいずれかが表示されます。これは、32MB が dlmalloc の内部ヒープのしきい値を超えているために機能するため、mmap() への呼び出しを使用してメモリを割り当てる必要があります。

ネイティブ コードから割り当てることができるメモリの量に一定の制限はありません。ただし、割り当てる量が多いほど、カーネルの低メモリ プロセス キラーが見やすくなります。

于 2013-04-16T21:03:24.183 に答える