2009-08-30 13 views

答えて

2

スタティックメモリの場合、スタック上にあることを意味します。いいえ、すべてのオブジェクトがヒープに割り当てられます。スタックにはプリミティブのみが割り当てられます。

編集:ダイナミックで静的な意味ではそれぞれヒープとスタックを意味するのかどうかはまだ分かりませんが、C/C++バックグラウンドを持つ人の質問がどこにあるのですか?それ以上。 Javaでは

、あなたは典型的な操作を行うとき:ヒープ上にメモリを割り当てます

Object o = new Object(); 

。あなたがメソッド内の場合:

int i = 1; 

その後、そのint型は、(それがクラス内のフィールドであれば、それはヒープに割り当てられます)、スタック上に割り当てられています。

+0

静的割り当てと動的割り当ての両方の例を挙げてください。 –

0

すべてのインスタンスメモリ(newを呼び出すことによって)がヒープに割り当てられ、すべてのパラメータがスタックに割り当てられます。しかし、java(非プリミティブ)パラメータはすべて参照(例外プリミティブ)によって渡されます。

+2

Javaでは、すべてのパラメータが値渡しされます。 –

+2

すべてのインスタンスは、インスタンスへのポインタのような参照によって渡されます。つまり、ポインタは値渡しですが、渡されたオブジェクトのメソッドを呼び出すと元のオブジェクトに変更されます –

+1

Javaは常に値渡しであり、オブジェクト参照も値渡しとなります(Javaオブジェクトでは常に参照によってアクセスされる)。これは、参照渡しとはまったく異なります。 http:// stackoverflow。com/questions/40480/is-java-pass-by-reference –

-1

非プリミティブが常にヒープに割り当てられているという主張は、間違っています。

JVMはを実行して、オブジェクトが常に1つのスレッドに限定されているかどうか、およびオブジェクトの存続期間が特定のスタックフレームの有効期間によって制限されているかどうかを判断できます。スタック上にオブジェクトを割り当てることができると判断できる場合は、JVMがそこにオブジェクトを割り当てることができます。

詳細はthis articleを参照してください。

+1

Java 6u14(-XX:+ DoEscapeAnalysisが有効な場合)は、スタック割り当てではなくスカラー置換のエスケープ解析を使用します。オブジェクトは*決してスタックには割り当てられませんが、そのフィールドはインライン展開され、ローカル変数として扱われます。 http://java.sun.com/javase/6/webnotes/6u14.htmlを参照してください。 –

0

「スタティック」は「スタック上に」という意味ではありません。

クラス静的変数の初期化で割り当てられたオブジェクトまたはstatic code blocksは、クラスロード時に割り振りが行われるという意味で静的に割り当てられます(プログラムの起動直後に静的に発生するようにすることができます)。

理論的には、そのような割り当てだけを使ってJavaプログラムを書くことができます。statically allocated、これはmallocとはまったく同じCプログラムと同じです。

このようなプログラムが正常に起動すると、実行できるすべてのメモリがあることが証明され、メモリ不足エラー、フラグメンテーションの問題、またはGCの一時停止が発生しません。

正しく書かれていれば、「それはできません」というエラーメッセージが返されます。

関連する問題