2011-02-03 6 views
1

なぜ構文を変更せずにスタックオブジェクトを持つことができないのか分かりません。範囲外にならないオブジェクトへの参照を誰かが作成した場合は、そのオブジェクトをGCにフラグを立てて破棄しないでください。これが事実でない場合、それを完全に破壊することは妥当である。なぜJavaは決定論的なデストラクタを持っていないのですか?

オブジェクト自体が参照を持っているかどうかにかかわらず、クラス自体の動作が異なるためですか?ソルバブルと思われます - オブジェクトにデストラクタがある場合、外部参照がある場合、インスタンスがスコープから外れる実行時エラーです。

ご理解ください。

+0

メタを参照してください:決定論的破壊が、私はあなたが今の... :) –

+1

ボーイを使用することができるようになります。 JavaはRAIIの問題に対処する方法です。 :-) –

+0

を間違った言語を選んだRAIIパターン –

答えて

1

私が理解できる限り、スタックオブジェクトを実装することはこの方法では実現可能ですが、ガベージコレクタ参照カウントが必要です。あなたが自然の一部だけ(多くの場合、 小)パートので、あまり を実行する必要があり 「本物」GC、と参照カウント増やすことができます

:ためのJava(おそらく.NET)は、このルートを回避してきました生成されたゴミは に含まれています。もう一つの要因は 速度である - 巧妙な、最適化されたGCは( ロッキングによるインクリメント/ 参照カウントが足さをデクリメントはるかcostyを作る)スレッド

の存在下で、特に に、 を参照カウントよりはるかに良好に行うことができ

this answer to why-dont-most-jvm-gcs-use-refcounts

0

なぜ構文を変更せずにスタックオブジェクトを使用することはできません。範囲外にならない オブジェクトへの参照を誰かが作成した場合は、 オブジェクトにGCフラグを設定し、 を破棄しないでください。オブジェクトを除き

はあなたの非常に次のメソッド呼び出しのために必要な場合がありますスペースを取って、スタックにです。 GCは、すべてのオブジェクトの削除時に実行されていないため、

+0

なぜこのことが分かりませんか? JVMは、ヒープ上のオブジェクトとスタック上のポインタを使ってこれを実装することができます。ポインタがスコープから外れてオブジェクトにデストラクタがある場合は、オブジェクトのrefcountをチェックして、実行時エラーでないことを確認します –

+0

@Dustin:ただし、refcountはありません。 –

0

最も簡単な答えがある - それは、定期的に実行しています - と努力がありますなぜそれは、JDK 7

http://blogs.oracle.com/darcy/entry/project_coin_try_out_try

Cしよう - と、リソースの追加の後ろに今だ++ GCのフレームワークであっても、スタックで作成されたオブジェクトの別個の概念を持つことで、RAIIのこの問題を回避します。

+0

私は提案したアプローチは、オブジェクトの削除時に実行する必要があると考えています –

+0

"誰もスコープ外に出てこないオブジェクトへの参照を作成する場合は?これによって、引数として渡されないオブジェクトを意味しますか?あなたは説得力のある議論をします... –

+0

誰も自分の参照を保存しない限り、それも渡すことができます。 (より良い点は、渡された参照のコピーを保存しますか?) –

1

通常のJVM実装では参照カウントは使用されません。したがって、参照カウントに依存するスキームは、通常のJVMでは失敗します。参照カウントをJVMに追加することには適合していますが、このような実装は非常に遅くなる可能性があります。

あなたの投稿にどのようなアプローチが示唆されているかはわかりません。オブジェクトに参照が行われたことを何らかの形で検出したい場合は、ほとんどの場合、最も単純なオブジェクトであっても検出が破られます。

{ 
A a = new A(); 
a.m(); 
} 

これは、2つの問題の問題があります。既に(評価スタック上の)オブジェクトを参照するローカル変数を読み取る

  • を。 「参照を作成する」が既に「スタックオブジェクトとして適格ではない」と考えられる場合、スタックオブジェクトのアプローチは実際的ではない
  • オブジェクトが呼び出され、this内部、呼び出し側には見えません。したがって、スタックオブジェクトを含むローカル変数に何らかの形でアクセスできるポリシーがあっても、実際にスタックオブジェクトのメソッド呼び出しを許可することはできません。 finalize()への呼び出しを含むので、スタックオブジェクトを持つことはかなり無意味です。
+0

最初の箇条書き参照カウントがあると私は考えていません。あなたの2番目の弾丸私は完全に理解していません。 –

+0

オブジェクトがファイナライズされている場合は、コンストラクタを実行する前にVMによってエンキューされます(つまり、技術的には余分な参照とみなすことができます:D) – bestsss

+0

@Dustin Getz:参照カウントがある場合はどちらも問題ありませんJavaのようなものはありません。 –

0

私は、この要件が問題だと思う:

オブジェクトが外部参照がある場合、スコープの外に行くためのデストラクタ、例えば、ランタイムエラーを持っている場合。

これは、型がデストラクタを持つローカル変数を宣言したメソッドから戻ったときにGCサイクルを実行する必要があるためです。

エッフェルのexpanded variablesに似たものが動作します。展開変数から参照変数(メソッドパラメータを含む)に代入するのは不正です。この問題は発生しません。

関連する問題