2

私は少し迷っています。最初のステップで大量のデータをロードし、これらをデータベースに入れる小さなアプリを作成しています。

データベースのすべてのエントリに対して、うまくいけばアークから解放される新しいオブジェクトを作成します:-)。

インストルメント ツールは、私のアプリが実際に 5 ~ 6 MB の割り当てを行っていることを示しています。しかし、アクティビティ モニターでは、実際には 100 MB の「物理」(リアル) メモリを使用していると表示されます。

どうすれば 100 mb を減らすことができますか? あなたが見ているメモリ リークはわずか 100 kb ですが、それは理由ではありません!?

楽器は5.67Mbの「ライブ」を示しています

楽器

アクティビティ モニターに 98Mb の実メモリが表示される

アクティビティモニター

4

1 に答える 1

4

簡単に言えば、心配する必要はありません。100Mb はそれほど多くありません

ここで知っておく必要がある主なことは、「実際の」または常駐RAM は、割り当てられた RAM とはまったく同じではないということです。大量の RAM を割り当てるとリンクされる可能性がありますが、そうではありません。

なぜそれらは同じではないのですか?

  • 割り当て解除 (またはガベージ コレクション) された RAM は、多くの場合 OS に返されないため、しばらくの間「常駐」することができます。

    これがあなたの場合の原因である可能性が最も高いです-データベースを割り当てられた大量のメモリ(一時的に1Gb)にしばらくロードしてから、割り当てを解除し、プロセスに大量のRAMを常駐させたままにします。

    ガベージ コレクション( ARCを含む) では、オブジェクトに割り当てられたメモリ空間は、それが一度保持したオブジェクトよりも長く存続する可能性があることに注意してください。ただし、常に 1K のデータしか使用されていませんでした。これは、プログラムの実行ループの特別なクリーンアップ フェーズまでガベージ コレクションが延期されるためです。

  • 常駐 RAM は 4Kb ページでのみ要求できます。これは、1 バイトの割り当てでも 4Kb もの常駐 RAM が割り当てられる可能性があることを意味します。通常、malloc は同じ 4k ページに複数の割り当てを配置しようとしますが、断片化による損失が発生します。

  • 現在使用されていない割り当てられた RAM は、ディスクにページアウトできるため、常駐ではなくなります。

  • アプリケーションには、malloc によって「割り当て」られていない一部の (おそらく大量の) メモリが含まれています。これには次のものが含まれます。

    • アプリケーション バイナリ - コードとデータ
    • アプリケーション ライブラリ - プライベートまたは共有 RAM 内
    • スタック
    • その他の共有メモリ
    • おそらくグラフィックス領域 (例: X11)、オープン ファイル バッファ、および mmaps (「割り当てられた」と見なされるものに応じて)。

    • デスクトップまたはラップトップ用。組み込みデバイスの場合は多く、電話やタブレットの場合は依存します。

于 2012-09-09T17:21:10.197 に答える