8

これは、Java配列を宣言するための通常の方法です。

int[] arr = new int[100];

ただし、この配列はヒープスペースを使用しています。C ++のようなスタックスペースを使用して配列を宣言する方法はありますか?

4

4 に答える 4

19

Arrays are objectsプリミティブ型またはオブジェクト型のどちらを保持するかに関係なく、他のオブジェクトと同様に、allocated space on the heap.

But then from Java 6u23バージョンEscape Analysisは、によって存在するようになりましたdefault activated in Java 7

Escape Analysis is about the scope of the objectwhen an object is defined inside a method scope rather than a class scope、その後、JVM は、このオブジェクトがこの制限されたメソッド スコープから逃れることができないことを認識し、それにさまざまな最適化を適用します.. 定数の折りたたみなど

Then it can also allocate the object which is defined in the method scope,
on the Thread's Stack, which is accessing the method.
于 2012-06-08T18:17:19.373 に答える
11

一言で言えば、いいえ。

スタックに格納される変数は、プリミティブとオブジェクト参照のみです。この例では、arr参照はスタックに格納されていますが、ヒープ上にあるデータを参照しています。

メモリがクリーンアップされていることを確認したいという理由でC++からこの質問をしている場合は、ガベージコレクションについて読んでください。つまり、Javaは、スタック上のメモリだけでなく、ヒープ内のメモリも自動的にクリーンアップします。

于 2012-06-08T18:05:00.033 に答える
3

配列は動的に割り当てられるため、ヒープに配置されます。

つまり、これを行うとどうなりますか?

int[] arr = new int[4];
arr = new int[5];

最初の割り当てがスタックで行われた場合、どのようにガベージコレクションを行いますか?参照arrはスタックに格納されますが、データの実際の配列はヒープ上にある必要があります。

于 2012-06-08T18:02:38.580 に答える
1

スタック上のデータを参照で渡すのは安全ではないため、値の型が必要になるため、言語機能としてはまだサポートされていません。

しかし、最適化 (エスケープ分析) として、ローカル/呼び出し先スコープをエスケープしないことが証明できる場合、JVM は小さな固定サイズの配列を含むローカル変数に対して既にそれを実行している可能性があります。とはいえ、これはランタイムの最適化であり、仕様を保証するものではないため、これに依存することは困難です。

于 2016-10-12T10:47:05.427 に答える