29

Javaについてはよくわかりません。

私はいくつかのリンクを調べていて、ブログに「スタックに格納されたJavaプリミティブ」と書かれているのを見つけました。これは、インスタンス変数またはローカル変数に依存していると思います。

いくつかのリンクをたどった後、私の結論は、


クラス変数 (プリミティブ) は、ヒープに含まれるオブジェクトの一部としてヒープに格納されます。

クラス変数 – オブジェクト (ユーザー定義) – は、含まれるオブジェクトの一部としてヒープに格納されます。これは、参照と実際のオブジェクトの両方に当てはまります。

メソッド変数 – プリミティブ – は、そのスタック フレームの一部としてスタックに格納されます。

メソッド変数 – オブジェクト (ユーザー定義) – はヒープに格納されますが、ヒープ上のその領域への参照は、そのスタック フレームの一部としてスタックに格納されます。Object に別のオブジェクトが含まれている場合、参照をヒープに格納することもできます。

静的メソッド (実際にはすべてのメソッド) と静的変数はヒープに格納されます。

私の理解が間違っている場合は修正してください。ありがとう。

4

3 に答える 3

15

オブジェクト用のスタックを使用する可能性がある JVM にはいくつかの最適化があり、これによりガベージ コレクションの労力が軽減されます。

クラスはヒープの特別な部分に格納されますが、それは使用する JVM によって異なります。(ホットスポットの Permgen fe <= 24)。

一般に、データの保存場所について考える必要はありませんが、可視性や存続期間などのセマンティクスについて考える必要があります。質問の説明はこれまでのところ良さそうです。

于 2013-10-16T11:33:06.210 に答える
1

オブジェクトはヒープに格納されます。

スタックに格納されているオブジェクト参照。

メソッド領域に格納される静的変数。

abc obj=new abc();

abc オブジェクトはヒープに保存され、オブジェクト参照はスタックに保存されます。

  static int i=10;

メソッド領域に格納された i 変数。

于 2013-10-16T11:57:31.570 に答える