1

コードが原因で、メモリリークに直面HashMapしています。アプリケーションに初めてログインすると、これHashMapが入力され、これを使用しMapてデータをキャッシュします。

このキャッシュされたデータをアプリケーションのいくつかの場所で使用しました。

アプリケーションで何も実行されていない場合、ログイン後、そのサイズは継続的に増加します。サイズは、ガベージ コレクターが自動的に呼び出されるか、それを呼び出す状況でのみ減少します。

しかし、その後、再び増加し始めます。確かにメモリリークですが、どうすれば回避できますか?

私のプロファイラーは、ホットスポットのメモリ割り当てとしても表示ResultSet.getString()しています。Statement.execute()これらのメソッドは、このキャッシュを作成するために使用されました。

これらのメソッドが原因でメモリリークが発生していますか? 最終ブロックでDB接続を閉じました。

これらのメソッドがまだ表示されているのはなぜですか?

4

1 に答える 1

3

上記のコメントで説明されているように、これはメモリ リークのようには聞こえません。

Java アプリケーションでは、JVM がオブジェクトを作成し、メモリを使い果たします。時間が経つにつれて、一部のオブジェクトは範囲外になります (ガベージ コレクションの対象になります) が、次のコレクションが発生するまで、それらはヒープ内にとどまり、「メモリを使い果たします」。これは問題ではなく、Java の仕組みです。JVM がメモリを解放する必要があると判断すると、コレクションが実行され、使用済みメモリが削除されます。

あなたが見ているものを気にする必要がありますか?すべき理由が 2 つ、すべきでない理由が 1 つ考えられます。ガベージ コレクションがアプリケーションの実行を継続するのに十分なメモリを解放し、コレクションがパフォーマンスに影響を与えず、他の用事で忙しい場合、気にする理由がわかりません。

ただし、アプリケーションがどのように動作するかを詳細に理解していないことを心配している場合、または「大量のメモリ」が問題である理由がある場合 (将来、さらに多くのデータでアプリケーションを実行したい場合、または必要になる場合)今後より少ないヒープを割り当てて実行する場合)、調査することをお勧めします。

アプリケーションが何もしていないときにメモリが使い果たされている場合は、それに集中します。「何もしていない」とき、それは実際に何をしているのですか?「何か」をしているに違いない

于 2012-02-27T10:28:56.710 に答える