2

ConcurrentHashMap値としてのjava-websocket WebSocketClientsのメモリが絶え間なく増加しています。

ピアのホワイトリストに毎秒再接続しようとするコードのセクションにそれを分離しました。接続障害の後にエントリが適切に削除されているかどうかをテストしましたが、そうです。また、「concurrenthashmap メモリ リーク」を見つけることができるすべてのものも調べました。

この可能な解決策を実装する方法がわかりません。その解決策は問題を解決しますか? もしそうなら、サンプルコードを提供してください。

この提案を実行しようとしました

ConcurrentHashMap<String, MyClass> m =
  new ConcurrentHashMap<String, MyClass>(8, 0.9f, 1);

成長率が多少遅くなったと思いますが、微調整する方法がわかりません。それは一般的に正しいアプローチですか?もしそうなら、サンプルコードを提供してください。

HashTable私もここで推奨されているようにaに切り替えてみましたが、ConcurrentModificationExceptionsすぐに取得できるので、それはアウトだと思います。

ConcurrentHashMap毎秒数千のエントリの挿入と削除が急速に行われる場合、この実装のメモリをどのように管理できますか? できない場合、代替手段はありますか?


コピーではなく参照渡し

HashMapを格納するを追加しましたnew WebSocket。接続は、ConcurrentHashMap.

これにより、メモリ管理が大幅に改善されましたが、1 秒あたり約 5 回の試行で、約 5 秒あたり約 0.1 MB のリークがまだ少しあります。

これは私のコード、WebSocketの「デストラクタ」、またはConcurrentHashMapの削除された値の管理に問題がありますか?


死んだObject

remove()前にからConcurrentHashMapを呼び出しclose()WebSocketClient最後にから を呼び出したため、成長率は再び大幅に低下remove()しましたHashMap

WebSocketClient閉じられて両方のマップから削除された後、どのように、そしてなぜまだ残っているのでしょうか?


System.gc();

漏れ率が大幅に減少しました!

の後に呼びますremove()

4

1 に答える 1

2

マップ自体がリークしている可能性はほとんどありません。マップに関連している場合、おそらく起こっていることは、マップを使い終わったときにマップからデータを削除できていないことです。マップが指している限り、GC を取得できません。

于 2014-02-01T01:41:40.557 に答える