0

背景情報
私はこのアプリを何ヶ月も構築しており、ほぼ完成しています。しかし、数日以来、次のようなログでメモリが増加しているのを見ています

D/dalvikvm(25624): GC_CONCURRENT freed 1782K, 17% free 22647K/27143K, paused 15ms+16ms, total 80ms

ご覧のとおり、大量のメモリが割り当てられています。そのため、数日間検索/読み取りを行い、MAT を使用してリークを見つけた後、アプリケーションを削除し、新しいプロジェクトでアクティビティごとに構築して、問題の原因を突き止めることにしました。

質問
現在、新しいプロジェクトがあり、アクティビティを 1 つだけ開いています。プロジェクトにいくつかの画像を追加しましたが、それらは使用されていません。アクティビティに関数を追加したので、ログで使用済みメモリを確認できます。

コード
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main);

        Log.d("HOME", "START");

        ShowMemoryStats("MAIN");
    }


    public void ShowMemoryStats(String activityName) {

        Double allocated = new Double(Debug.getNativeHeapAllocatedSize())
                / new Double((1048576));
        Double available = new Double(Debug.getNativeHeapSize()) / 1048576.0;
        Double free = new Double(Debug.getNativeHeapFreeSize()) / 1048576.0;
        DecimalFormat df = new DecimalFormat();
        df.setMaximumFractionDigits(2);
        df.setMinimumFractionDigits(2);

        Log.d("gettings", "debug. START ================================= "
                + activityName);
        Log.d("gettings",
                "debug.heap native: allocated " + df.format(allocated)
                        + "MB of " + df.format(available) + "MB ("
                        + df.format(free) + "MB free)");
        Log.d("gettings",
                "debug.memory: allocated: "
                        + df.format(new Double(Runtime.getRuntime()
                                .totalMemory() / 1048576))
                        + "MB of "
                        + df.format(new Double(
                                Runtime.getRuntime().maxMemory() / 1048576))
                        + "MB ("
                        + df.format(new Double(Runtime.getRuntime()
                                .freeMemory() / 1048576)) + "MB free)");

        Runtime rt = Runtime.getRuntime();
        long maxMemory = rt.maxMemory();
        Log.v("onCreate", "maxMemory:" + Long.toString(maxMemory));

        ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
        int memoryClass = am.getMemoryClass();
        Log.v("onCreate", "memoryClass:" + Integer.toString(memoryClass));

        Log.d("gettings", "debug. END ================================= "
                + activityName);
    }

結果
デバッグ。START =============================== MAIN debug.heap ネイティブ: 2,59MB のうち 2,41MB を割り当て (0 ,18MB 空き) debug.memory: 割り当て: 64,00MB のうち 12,00MB (0,00MB 空き) maxMemory:67108864 memoryClass:64 デバッグ。終了 ================================= メイン

だから今、私はこのメモリ使用量の原因を知りたいだけです. これは、すべてのアプリが起動時に取得するある種のデフォルト メモリですか?

助けてくれてありがとう。

更新 [2012 年 12 月 30 日]
まだこの問題に取り組んでいますが、問題ではないと思うことがあります。その理由は、AVD (ヒープサイズ: 24MB) を使用すると、まったく異なる結果が表示されるためです。 ここに画像の説明を入力

携帯電話 (Galaxy S3) でアプリをデバッグする場合と比較して: ここに画像の説明を入力

4

1 に答える 1

0

MAT を使用している場合は、疑わしいと見なされるスレッドに基づいてリークを検索できるはずです。

また、特定の疑わしいオブジェクトから特定のデータを取得したい場合は、これを試してください: http://www.javamex.com/classmexer

※Android APIがこの種の仕組みをサポートしているかどうかはわかりません。

于 2012-12-27T14:11:52.340 に答える