質問があります
たとえば、メソッド内で変数を宣言するとどうなりますか。
ボイド myMethod() { myShip = new Ship(); を発送します。 }
myShip 参照は、スタックまたはヒープのどこに割り当てられますか?
私はスタックで考えていますが、J2MEゲームプログラミングの本「JavaクラスはJavaヒープにインスタンス化されています」を読んでいたので混乱しています
すべての Java クラス ?
前もって感謝します
質問があります
たとえば、メソッド内で変数を宣言するとどうなりますか。
ボイド myMethod() { myShip = new Ship(); を発送します。 }
myShip 参照は、スタックまたはヒープのどこに割り当てられますか?
私はスタックで考えていますが、J2MEゲームプログラミングの本「JavaクラスはJavaヒープにインスタンス化されています」を読んでいたので混乱しています
すべての Java クラス ?
前もって感謝します
myShip
Ship
オブジェクトへの参照でありmyShip
、「スタック」と呼ばれるメソッド呼び出しスタックにあります。メソッドが呼び出されると、メモリ ブロックがスタックの一番上にプッシュされます。そのメモリ ブロックには、すべてのプリミティブ (int、float、boolean など) と、メソッドのパラメーターを含むメソッドのオブジェクト参照のためのスペースがあります。ヒープは、実際のオブジェクトのメモリが割り当てられる場所です。
myShip
スタック上もそうで、Ship
オブジェクトはヒープ上にあります。
各スレッドには独自のスタックがありますが、ヒープは共有されていることに注意してください。
Java は、実際には少し異なることを行います。参照は基本的にスタック上にあります。オブジェクトのメモリは、ヒープに渡されるものに割り当てられます。ただし、割り当て可能なメモリの実装は、C/C++ モデルでのヒープの実装方法とはまったく異なります。
そのような新しいオブジェクトを作成すると、その名前がそのスコープの参照テーブルに効果的に配置されます。これは、C++ のオブジェクトへのポインターによく似ています。範囲外になると、その参照は失われます。割り当てられたメモリは参照されなくなり、ガベージ コレクションが可能になります。
現在、すべての Java オブジェクトはヒープに割り当てられています。Java 7 はエスケープ解析を行い、スタックに割り当てられるようになるかもしれないという話がありますが、提案がまだ確定しているかどうかはわかりません。これが RFEです。
編集:どうやら、すでに JDK 7 の初期ビルドに含まれているようです。(この記事では、JDK 6u14 にも含まれると書かれていますが、確認できていません。)
概念的には、オブジェクトは「ヒープ」に置かれます。次に、これはメソッド ローカル参照であるため、実際の参照はスタック上にあります。「その」スタックとは、少なくとも Sun の VM の場合、ネイティブ スレッド スタック (つまり、C のローカル変数が割り当てられるのと同じスタック) を意味しますが、それは実際には要件ではないと思います (JVMネイティブスタックからかどうかに関係なく、各メソッド呼び出しで割り当てる「スタックフレーム」の抽象的な概念が必要です)。
しかし...最新のVM(より単純な組み込み/ mpbile VMの可能性のある例外を除いて)では、「the」ヒープのようなものは実際にはありません。実際には、さまざまなヒープ領域があります。これらの中で最も単純なものは通常、ほとんど「ミニ スタック」のようなもので、オブジェクトをすばやく割り当てられるように設計されています。このオブジェクトは、長くぶらぶらすることがなく、ほとんど一度に割り当てを解除できる可能性があります。
別の投稿者が述べたように、高度に最適化された JVMは原則としてオブジェクト データをスタックに割り当てることができ、これには明確な提案があります。参考文献の 1 つでも述べられているように、これに対する批判は、とにかく高速な「eden」ヒープがほとんどスタックのようなものであるということです (単に「スタック」ではありません)。