Java列挙型はAndroidランタイムでヒープメモリを割り当てますか?

マールテン

Androidでのガベージコレクションについて話している2人のAndroidエンジニアによるビデオを見ていました。はじめに、彼らは列挙型に対して少し冗談を言います。Romain Guyは次のように述べています。「そこで修正する必要があります。列挙型、割り当てられません。それが要点です。」最初は、列挙型が他の言語でこのように機能するため、Romainが冗談を言っただけです。しかし、この後、Chetは、列挙型が実際に割り当てられないことを認めているようですが、いくつかの「メモリ関連」の処理を実行しています(つまり、スタック上に存在します)。この反応は私を混乱させるものです。

https://youtu.be/Zc4JP8kNGmQ?t=96

私の理解では、Javaの列挙型は基本的にクラスインスタンスの固定コレクションであり、メモリの観点からはオブジェクトのインスタンス化と同じくらい優れた実装見なされるEnumObjectため、ヒープに割り当てられます。

しかし、コンパイラが列挙型について引き出すことができる強力なプロパティのために、列挙型には特別なステータスがあると想像できます。同様に、Stringリテラルの共有プールのように、さまざまな最適化があることを私は知っています。

現在、アプリケーションで定数として使用するオブジェクトのリストを修正している状況にあります。したがって、これを列挙型またはクラスインスタンス化の配列として実装できます。読みやすさが問題ではないと仮定すると、前者を実行する方がパフォーマンスが高いでしょうか?

アンディターナー

列挙型はオブジェクトです。すべてのオブジェクトと同様に、それらはヒープ上に存在します。

実際、次のような単純な列挙型を逆コンパイルすると、次のようになります。

enum Foo { A, B }

それはこのように見えます(いくつかのものは省略されています):

  static {};
    Code:
       0: new           #4                  // class Foo
       3: dup
       4: ldc           #7                  // String A
       6: iconst_0
       7: invokespecial #8                  // Method "<init>":(Ljava/lang/String;I)V
      10: putstatic     #9                  // Field A:LFoo;
      13: new           #4                  // class Foo
      16: dup
      17: ldc           #10                 // String B
      19: iconst_1
      20: invokespecial #8                  // Method "<init>":(Ljava/lang/String;I)V
      23: putstatic     #11                 // Field B:LFoo;
      26: iconst_2
      27: anewarray     #4                  // class Foo
      30: dup
      31: iconst_0
      32: getstatic     #9                  // Field A:LFoo;
      35: aastore
      36: dup
      37: iconst_1
      38: getstatic     #11                 // Field B:LFoo;
      41: aastore
      42: putstatic     #1                  // Field $VALUES:[LFoo;
      45: return

これは基本的に次のようなクラスと同じです。

class Bar {
  static final Bar A = new Bar("A");
  static final Bar B = new Bar("B");

  static final Bar[] $VALUES;

  static {
    Bar[] array = new Bar[2];
    array[0] = A;
    array[1] = B;
    $VALUES = array;
  }

  private Bar(String name) {}
}

これは次のように逆コンパイルされます。

  static {};
    Code:
       0: new           #2                  // class Bar
       3: dup
       4: ldc           #3                  // String A
       6: invokespecial #4                  // Method "<init>":(Ljava/lang/String;)V
       9: putstatic     #5                  // Field A:LBar;
      12: new           #2                  // class Bar
      15: dup
      16: ldc           #6                  // String B
      18: invokespecial #4                  // Method "<init>":(Ljava/lang/String;)V
      21: putstatic     #7                  // Field B:LBar;
      24: iconst_2
      25: anewarray     #2                  // class Bar
      28: astore_0
      29: aload_0
      30: iconst_0
      31: getstatic     #5                  // Field A:LBar;
      34: aastore
      35: aload_0
      36: iconst_1
      37: getstatic     #7                  // Field B:LBar;
      40: aastore
      41: aload_0
      42: putstatic     #8                  // Field $VALUES:[LBar;
      45: return

列挙型から得られる他のいくつかの特別なものがあります(反射的に折り目が付けられないことの保証など)。しかし実際には、それらは単なる通常のオブジェクトです。

彼らが作ろうとしているのは、列挙型が2回以上割り当てられないということです(本当にシングルトンが必要な場合は、列挙型を実装するのに適した方法です)。したがって、列挙型クラスをロードするために少額の固定費を支払います。ただし、同じインスタンスを何度も再利用できます。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

プログラムのメモリ割り当てによると、列挙型、構造体、共用体、クラス、インターフェイス、およびそれらの間の関係の違いは何ですか

プライベート/保護されたメンバーに基づいてクラス列挙型を割り当てることはできますか?

Arcのジェネリック型のヒープ割り当てメモリをラップしますか?

Nilが1つの列挙型サイズを増やしても別の列挙型サイズを増やしないのはなぜですか?Rust列挙型にメモリはどのように割り当てられますか?

列挙型メンバーを void ポインターに割り当てますか?

コンパイラはヒープメモリ割り当てを最適化することを許可されていますか?

Javaのコンストラクターでジェネリック列挙型を割り当てる方法は?

printlnマクロはヒープメモリを割り当てますか?

文字列はどのようにメモリをヒープに割り当てますか?

派生クラスのインスタンス化は、基本クラスのプライベートメンバーにメモリを割り当てますか?

Javaがメモリ割り当てにヒープを使用するのはなぜですか?

ehcacheはmaxBytesLocalHeapで設定されたヒープメモリを予約(割り当て)しますか?

mallocはメモリを非ポインタ型に割り当てます

動的にメモリを割り当てるときの「ポインタ型」のポイントは何ですか?

std :: vectorのメモリ/ランタイム効率とは何ですか?また、そのメモリ割り当て戦略は何ですか?

ヒープメモリを割り当てずにインターフェイスを使用するフレームワークアプリケーション?

Cプログラム(C ++ではない)で実行時メモリ割り当ての不正なポインタエラーを処理する方法は?

Cプログラム(C ++ではない)で実行時メモリ割り当ての不正なポインタエラーを処理する方法は?

Javaは列挙型の共変リターンタイプをサポートしていませんか?

ヒープメモリの割り当てがスタックメモリの割り当てよりもはるかに速いのはなぜですか?

コンパイラーはヒープからスタック割り当てに最適化できますか?

クラスのデストラクタは、char *型のデータメンバーのメモリを自動的に割り当て解除しますか?C ++

最大ヒープサイズxmxは、Javaのメモリ割り当て/使用ヒープにどのように影響しますか?

パラメータがポインタ型の場合、パラメータはローカルメモリに割り当てられたポインタです

Typescriptはタイピングエラーを列挙します(タイプ 'string'の引数はタイプのパラメーターに割り当てることができません)

ヒープはいつ動的メモリ割り当てに使用されますか?

Cランタイムエラー:Forループでメモリを動的に割り当てる

列挙型パラメーターを持つクラスのフレンド演算子は、ケーニッヒルックアップで見つける必要がありますか?

ヒープにメモリを割り当てるときに配列の減衰を防ぎますか?

TOP 一覧

  1. 1

    セレンのモデルダイアログからテキストを抽出するにはどうすればよいですか?

  2. 2

    Ansibleで複数行のシェルスクリプトを実行する方法

  3. 3

    tkinterウィンドウを閉じてもPythonプログラムが終了しない

  4. 4

    Windows 10 Pro 1709を1803、1809、または1903に更新しますか?

  5. 5

    Crashlytics:コンパイラー生成とはどういう意味ですか?

  6. 6

    GoDaddyでのCKEditorとKCfinderの画像プレビュー

  7. 7

    パンダは異なる名前の列に追加します

  8. 8

    モーダルダイアログを自動的に閉じる-サーバーコードが完了したら、Googleスプレッドシートのダイアログを閉じます

  9. 9

    グラフ(.PNG)ファイルをエクスポートするZabbix

  10. 10

    Chromeウェブアプリのウェブビューの高さの問題

  11. 11

    ラベルとエントリがpythontkinterに表示されないのはなぜですか?

  12. 12

    Windows 10の起動時間:以前は20秒でしたが、現在は6〜8倍になっています

  13. 13

    mutate_allとifelseを組み合わせるにはどうすればよいですか

  14. 14

    Reactでclsxを使用する方法

  15. 15

    ネットワークグラフで、ネットワークコンポーネントにカーソルを合わせたときに、それらを強調表示するにはどうすればよいですか?

  16. 16

    テキストフィールドの値に基づいて UIslider を移動します

  17. 17

    ファイル内の2つのマーカー間のテキストを、別のファイルのテキストのセクションに置き換えるにはどうすればよいですか?

  18. 18

    MLでのデータ前処理の背後にある直感

  19. 19

    Unity:未知のスクリプトをGameObject(カスタムエディター)に動的にアタッチする方法

  20. 20

    Pythonを使用して同じ列の同じ値の間の時差を取得する方法

  21. 21

    グラフからテーブルに条件付き書式を適用するにはどうすればよいですか?

ホットタグ

アーカイブ