2

同じクラスのシリアル化されたオブジェクトが大量 (おそらく 100K+、場合によっては数百万) あるファイルがあるとします。これらのオブジェクトを読み取り、それらを使って何かを行います。

//open stream
try{ 
    while(true) {
        Object o = ois.readObject();
        foo(o);
    }
}catch(EOFException){
}
//close stream...

これが完了すると、非常に不快なほど大量のオブジェクトが作成されます。私の問題は、これらのオブジェクトを制御できないことであり、GC が決定するまで解放されません。

作成される新しいオブジェクトの量に上限を設定する方法はありますか? たとえば、ファイルに 100K のシリアル化されたオブジェクトがある場合、固定サイズのプールが使用されるように readObject メカニズムを微調整する方法はありますか?

詳細

~100K のオブジェクト ファイルは、多数の小さなファイルをマージした結果です。この小さなプロセスが行っていることは、並べ替えられた csv ファイルを作成することです。

4

5 に答える 5

2

これまでに提案されたコメントや回答はどれも機能しません (それらのほとんども不要です)。これはObjectInputStream、オブジェクト グラフを保持するために、それ自体がこれまで逆シリアル化したすべてのオブジェクトへの参照を保持しているためです。

ファイルに書き込まれるデータ量を制限する必要があるため、ファイルごとに 100,000 個のオブジェクトを処理する必要はありません。可能であれば、それぞれの Javadoc コメントで説明されている理由により、ObjectOutputStream.reset()またはも使用する必要があります。ObjectOutputStream.writeUnshared()

于 2013-10-11T06:46:21.993 に答える
0

ファイルから各オブジェクトへの PhantomReferences の固定サイズのコレクションを作成してみることができます。

コレクションがいっぱいになると、既存の PhantomReference を ReferenceQueue から (ブロッキング呼び出しとして) 取得/削除できる場合にのみ、ファイルから別のオブジェクトを読み取ります。その後、固定サイズのコレクションからそれを削除し、別のオブジェクトを許可します。作成されます。

ReferenceQueue から削除した後、PhantomReference で「clear()」を呼び出すことを忘れないでください。

お役に立てれば!

Phantom References の詳細については、次のドキュメントを参照してください: https://weblogs.java.net/blog/kcpeppe/archive/2011/09/29/mysterious-phantom-reference

そしてここ: http://java.dzone.com/articles/finalization-and-phantom

于 2013-10-11T05:50:43.240 に答える