5

請求書を保存するデータベースがあります。すべての請求書からの情報を使用して一連のアルゴリズムを使用して、特定の月の複雑な操作を行う必要があります。多くの請求書が存在する可能性があるため、これらの操作に必要なデータを取得して処理するには、大量のメモリが必要です。ユーザーがこれらの計算のために要求した間隔が数年に及ぶと、問題はますます悪化します。その結果、PermGen 例外が発生します。これは、ガベージ コレクターが各月の計算の間にその仕事をしていないように見えるためです。

System.GC を使用して、GC がその仕事をするようにほのめかすことは、良い習慣ではありません。私の質問は、それ以外にメモリを解放する方法はありますか? 部分的な計算を一時的に保存するために、JVM に HD スワッピングを使用させることはできますか?

また、各月の計算の終わりに System.gc を使用しようとしましたが、その結果、CPU 使用率が高くなり (ガベージ コレクターが呼び出されたため)、メモリ使用量がかなり少なくなりました。これでうまくいくかもしれませんが、これが適切な解決策になるとは思いません。

4

2 に答える 2

1

System.gc()ガベージ コレクターを実際に実行するわけではないことを覚えておく必要があります。それは単に同じことをするように求めます。JVM は、ガベージ コレクターを実行する場合と実行しない場合があります。私たちにできることは、不要なデータ構造をガベージ コレクションに使用できるようにすることだけです。次の方法でも同じことができます。

  1. Null使用後にデータ構造の値として代入する。したがって、アクティブなスレッドはそれにアクセスできません(つまり、gc で有効にします)。
  2. 新しいものを作成する代わりに、同じ構造を再利用します。
于 2013-04-29T14:48:53.313 に答える