2017-11-10 5 views
1

値のタイプがFooで、Fooへの参照を受け入れる方法Barがあります。ほとんどの言語では、新しいFooをスタックに割り当てることができ、Barに転送しようとすると自動的にそれをボックスに入れます。しかし、私が知っている限り、これはヒープにFooの値をコピーし、その参照を使用します。ガベージコレクション言語は、オブジェクトをスタックにインラインで割り当てることができますか?

スタックにガベージコレクションされたオブジェクトを割り当てる方法を言語に含めることは可能ですか?メソッドが終了すると、ランタイムはオブジェクトがまだ使用中であるかどうかを確認し、ヒープ上にオブジェクトを割り当てて参照を更新する必要があります。

これは、参照を保持しないメソッドのパフォーマンスを向上させ、そうしたメソッドのパフォーマンスを低下させると思います。

+1

たとえば、Javaで使用されている[エスケープ解析](https://en.m.wikipedia.org/wiki/Escape_analysis)を参照してください。 –

+0

を参照してください。https://stackoverflow.com/questions/25903320/creating-objects-on-the-stack-memory-in-java – Raedwald

答えて

1

はい、Graalのpartial escape analysisはそうです。通常のEAは、オブジェクトがエスケープしていないときにスタック割り当て(より正確には、フィールドに分解し、フィールドをスタックに置くこと)のみ可能ですが、EAはスタックに楽観的に割り当てることができ、オブジェクト存在しなければならない。

ガベージコレクションはバイナリの選択ではありません。ガベージコレクション、再カウント、アリーナ、またはスコープベースのアロケータを、自動的に割り当てを解除し、完全に手動で管理する環境を混在させることができます。そのような場合、スタック割り当ては後者のものの1つになることがありますが、一部のヒープはガベージコレクションされます。

+0

TLAB割り当てが既にスタック割り当てと同じくらい効果的であることに気付くかもしれませんが、メソッドに 'Foo'を渡すとオブジェクトをコピーする必要がないので、実際にはそのオブジェクトへの参照を必要としないヒープ変数に格納することもできますそのようなコピー。オブジェクトが次のgcに残っている場合にのみ、そのオブジェクトはコピーされます。 EAの後のフィールドへの分解は、その後の最適化を可能にし、これらのフィールドをローカル変数のように扱うため、さらにうまく機能します。 – Holger

関連する問題