3

Android の各プロセスに割り当てられるメモリの量を理解しようとしています。私が理解しているように、アプリプロセスごとに Zygote プロセスの個別のインスタンスがあり、Zygote は Dalvik VM をフォークします。

ループで「hello world」を出力するだけの小さなサンプル Java アプリケーションを作成しました。その後、ADB シェルを介して Dalvik VM を呼び出しました。さて、Procrank コマンドは、

PID Vss Rss Pss Uss コマンドライン 9374 7556K 7556K 3600K 3384K dalvikvm

ここに表示されている USS は 3384k です。

その後、1 つのアクティビティと TextView を持つ小さな Android プログラムを作成しました。今、ショーを挑発する

PID Vss Rss Pss Uss コマンドライン 6540 37256K 35124K 4387K 3392K com.example.helloworld

私の質問は次のとおりです。

  1. 各アプリ プロセスに Dalvik VM が含まれている場合、より多くのメモリを使用しませんか?
  2. VM が占有するメモリのサイズと Java プロセスが占有するサイズは、どうすればわかりますか?

Dalvik とその呼び出し方法、および各プロセスで VM が占有するメモリに関して、私の理解は間違っている可能性があります。

どんな洞察も大歓迎です。

ありがとう。

4

1 に答える 1

5

さて、私はこの質問に対する専門家の回答を期待してかなりの時間を待ちました. 私が知っていることをあなたに共有させてください。

最初の質問への回答 : 「各アプリ プロセスに Dalvik VM が含まれている場合、メモリの使用量が増えることはありませんか?」

Dalvik ヒープには、zygote によってクラスとデータがプリロードされます (Android バージョン 2.2 の時点で 1900 を超えるクラスがロードされます)。Zygote が Android アプリケーションを開始するために fork すると、新しいアプリケーションはこのヒープのコピー オン ライト マッピングを取得します。Dan Borstein が以下で述べているように、これはメモリの削減とアプリケーションの起動時間の短縮に役立ちます。

It's used in Android to amortize the RAM footprint of the large amount of effectively-read-only data (technically writable but rarely actually written) associated with common library classes across all active VM processes. 1000+ classes get preloaded by the system at boot time, and each class consumes at least a little heap for itself, including often pointing off to a constellation of other objects. The heap created by the preloading process gets shared copy-on-write with each spawned VM process (but again doesn't in practice get written much). This saves hundreds of kB of dirty unpageable RAM per process and also helps speed up process startup.

あなたの 2 つの質問: 「VM が占有するメモリのサイズと Java プロセスが占有するサイズをどのように知ることができますか?」

dalvikのメモリについて明確にするために、「Javaプロセスが占有するサイズ」 チェックリンクの意味がわかりませんでした。

procrank に加えて、adb shell dumpsys meminfo 'your apps package name' このリンク を使用して dumpsys の詳細を確認することもできます。

于 2013-01-21T10:38:36.860 に答える