2011-01-15 6 views
2

パフォーマンス上の理由からString.intern()を使用する外部ライブラリを使用しています。それは大丈夫ですが、私は与えられたランでそのライブラリたくさんを呼び出すことだし、私は恐ろしい保留中の文字列を "フラッシュ"する方法はありますか?

java.lang.OutOfMemoryError: PermGen space

もちろん、私は、JVMコマンドライン-XX:MaxPermSize修飾子を使用することができますが、その解決策ではないに実行します非常にスケーラブルです。代わりに、定期的に(ライブラリ呼び出しの2つの「バッチ」の間で)、インターネットされた文字列プールを "フラッシュ"します。つまり、Stringクラスが保持する静的な文字列テーブルを空にしますか?

+1

"細かい"の定義を再評価する必要がありますね:p –

+0

@pst yea私が言っていることは、これらの文字列が十分な理由のために保留されていることです。すべての呼び出しの後にそのテーブルを "フラッシュ"したくないか、完全にインターンシップをしたくないということです。各バッチの内部では、ライブラリは以前の呼び出しからインターンを楽しむことができます。 – Oak

+0

奇妙 - ちょうど現代のJVMが内部文字列をgcしてくれると言っている[記事](http://www.codeinstructions.com/2009/01/busting-javalangstringintern-myths.html)を読んでください。多分あなたは未使用のStringオブジェクトへの多くの参照を保持しているでしょうか? –

答えて

3

いいえ、ちょうどサイズpermgen。ヒープのサイズを適切に調整する必要はありません。恐れるな!

3

さらに調査すると、私はthis articleを見つけました。これは、保留中の文字列がまだガベージコレクションされていることを示しているようです。私はここに私の問題が深いものであることを意味すると思います - 私が使っている図書館はまだこれらの文字列への生きている参照を保持しなければなりません:(

+0

あなたはちょうど..ライブラリにあなたのすべての参考文献をちょっと殺して、すべてのバッチを '始める'ことはできませんか?私がそれを正しく読めば、GCは '古い'拘束された文字列のために入り込むはずです。あなたは幸せかもしれませんか? – Nanne

+0

@Nanneライブラリは、静的変数を自由に使用します(シャーダー)。それは、私が頼りにしてくれた、ちょっとした 'reset()'関数を持っていますが、それは不完全だと思います。それにもかかわらず興味深い記事; – Oak

+0

;) – Nanne

関連する問題