2011-10-20 21 views
0

私はプレイフレームワークを使用しています。私は後で使用されるため、今使用されているかどうかにかかわらず、毎回自分のオブジェクトの1つを生きていきたい。gcが呼び出された後、

オブジェクトの作成は時間を要する処理(10Lレコードを含む)です。オブジェクトはしばらくアクセスされていなければgcされます。

私の考えは、オブジェクトにアクセスし、gc'edされる前にそれを生かしておくことです。 @Before注釈付きの関数でオブジェクトにアクセスしようとしましたが、動作しません。私の主なアイデアは、オブジェクトを生かし続けることです。私がgc関数が何時から呼び出されたのかを知っていれば、playframework内のジョブ機能を使用して生き続けることができます。

+1

GCは単なる時間駆動型ではありません。GCは参照カウントと参照カウントに基づいています。 –

+1

@Dave Newtonのリーチャビリティベース(参照カウントなし)。 – EJP

+0

@EJPこれは、GCの実装に関する仕様に何かがある場合です(わかりません)。 –

答えて

2

ガベージコレクションの仕組みを誤解しているようです。あなたがスケジュールされた仕事にそれを渡すことができるどこかであなたのオブジェクトへの参照を保持しているなら、その参照そのものはオブジェクトが収集されるのを妨げるでしょう。これが適用されない唯一の方法は、(n)(evil) singleton objectを使用して問題のオブジェクトへの参照を取得し、そのオブジェクトをタスクに定期的に触れることでその場合のガベージコレクションを禁止しない場合です。その単純な解決策は、その(邪悪な)パターンを使わないことです。あなたの質問に対する実際の答えは、単に「あなたがオブジェクトで終わっていないなら、それを参照しないようにしてください。」それは非常に自然な解決策です。

4

ガベージコレクタは、オブジェクトへの参照がなくなった場合にのみオブジェクトをクリーンアップします。この特定のオブジェクトが存在し、少なくとも1つの変数によって参照されていることを確認して、ガベージコレクション中に削除されないようにする必要があります。

シングルトンスタイルのデザインパターンを使用して調査したい場合は、オブジェクトへの参照があることを確認しますが、一度に1つのオブジェクトしか存在しません。

このように、オブジェクトは少なくとも1つの変数によって参照されているのでガベージコレクションされません。

こちらがお役に立てば幸いです。

+1

「私はこのオブジェクトが生きていることを確かめたい」と思います。 「1つのインスタンスをグローバルにアクセス可能にし、他のインスタンスを禁止する必要があります」とはまったく異なる要件です。 –

+0

だから、オブジェクトを生かし続けるシングルトンパターンを使用して、問題を解決するつもりはありませんか?あなたは他にどのような提案をしていますか?私は、これが上記の要件を満たした場合、これが最も簡単な解決策であると考えました。 – Ewald

+0

最も簡単な解決策は、オブジェクトを 'static'フィールドに貼り付けることです。シングルトンを作ることは、全く無関係なセマンティクスと不必要な複雑さを追加します。 –

関連する問題