1. ホーム
  2. android

[解決済み] アプリが使用できるRAMの最大量はどのくらいですか?

2022-04-27 19:14:05

質問

に関する質問で、かなり気になることがあります。 Androidオペレーティングシステムのメモリ管理 ということで、かなり詳細な回答を期待します。

知りたいこと

  • とは何ですか? 最大メモリ容量 (単位 メガバイト / として パーセント システムアプリではない)Androidアプリケーションが使用できるRAMの総量は?
  • との違いはありますか? Androidのバージョン ?
  • に関する違いはありますか? メーカー を選択しましたか?

そして、最も重要なこと。

  • は、/とみなされます。 何に依存するか アプリが実行時に使用できる RAM の量をシステムが決定する場合(アプリごとのメモリの最大値は固定値ではないと仮定)、どのように決定するのでしょうか?

これまで(2013年まで)に聞いたこと。

  • 初期のAndroid端末では、アプリごとの上限が16MBだった
  • その後、上限は24MBまたは32MBに増加

とても気になること。

どちらも上限がとても低いです。

最近、ダウンロードしたばかりの Androidタスクマネージャ を使用して、自分のデバイスのRAMをチェックします。これは、RAMの最大使用量である32MBを明らかに超えています。では、Androidはどのようにしてアプリが使用できるRAMの量を決定しているのでしょうか?アプリがその制限を超えることは、どのようにして可能なのでしょうか?

さらに、私のアプリのいくつかは、(システムによって殺された?) OutOfMemoryException 30-40メガバイト程度を使用した場合。一方、私の携帯電話上で動作しているアプリは 100MB以上 がクラッシュしたり、強制終了されることはありません(おそらくメモリリークのため)。 そこで また、アプリ自体にも依存することは明らかです。 RAMをどれだけ節約できるかを判断することになります。これはどのように可能なのでしょうか? (私は768MB RAMのHTC One Sでテストを行いました。)

免責事項:私はAndroidタスクマネージャーアプリと一切関係がありません。

解決するには?

<ブロッククオート

Androidアプリケーション(システムアプリケーションではない)が使用できる最大メモリ量(メガバイト単位/総RAMに対する割合)は?

それは端末によって異なります。 getMemoryClass() オン ActivityManager を実行すると、コードが実行されているデバイスの値が表示されます。

<ブロッククオート

Androidのバージョンによって違いはありますか?

OSの要件が年々高まっており、それに合わせて端末も調整しなければならないという点では、そうですね。

<ブロッククオート

端末のメーカーによる違いはあるのでしょうか?

メーカーがデバイスを製造している以上、デバイスによって大きさは異なります。

アプリが使用できるRAMの量を決定する際、どのようなサイドファクターが考慮されるのですか?

サイドファクターとは何ですか?

初期のデバイスはアプリごとの上限が16MB、後のデバイスは24MBまたは32MBに増加した

それくらいがちょうどいいんです。画面の解像度は重要な要素で、解像度が高いほどビットマップも大きくなるので、タブレットや高解像度の携帯電話ではまだ値が高くなる傾向があります。例えば、48MBのヒープを持つデバイスを見かけますが、それ以上の値があっても不思議ではありません。

<ブロッククオート

アプリがその制限を超えるのはどうしてですか?

そのアプリの作者が何をやっているのか分かっていると仮定しているのですね。ということを考えると アプリのメモリ使用量は、Androidのコアエンジニアが判断するのは難しい そのため、当該アプリが必ずしも正確な結果を出しているとは思えません。

とはいえ、ネイティブコード(NDK)はヒープ制限の対象外です。Android 3.0 以降、アプリは "大きなヒープ" を要求することができ、通常は数百 MB の範囲ですが、ほとんどのアプリでは不適切な形式と見なされています。

<ブロッククオート

さらに、私のアプリの中には、30~40メガバイト程度を使用すると、OutOfMemoryExceptionでクラッシュするものがあることに気づきました。

Androidのガベージコレクタは、コンパクト化するガベージコレクタではないことに留意してください。例外は本当に CouldNotFindSufficientlyLargeBlockOfMemoryException が、これは言葉足らずと判断されたのでしょう。 OutOfMemoryException というのは 要求したブロックを割り当てられませんでした。 ヒープを完全に使い切ったわけではありません。