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()
。