メモリリークの問題を修正しようとしています。ヒープダンプ解析では、ConcurrentHashMap
が98% of heap memory
を占有しています。コードをチェックしたところ、ConcurrentHashMap
インスタンス化ではパラメータなしのコンストラクタが使用されていることが判明しました。 concurrencyLevelのデフォルトの設定は16です。このマップのインスタンス化後、私はデータがマップに置かれている同期メソッド呼び出しを見ます。同期メソッドConcurrentHashMapの同時実行レベル
私はデータが同期化されたメソッドでのみ置かれているので、concurrencyLevelをConcurrentHashMap
に設定しても安全ですか?
以下はサンプルコードスニペットです:
private volatile Map<String, Integer> storeCache;
public void someMethod() {
storeCache = new ConcurrentHashMap<String, Integer>();
syncMethod();
}
private synchronized void syncMethod() {
storeCache.put("Test", 1);
}
CHMはバイト配列を使用しないため、これは何の違いもありません。デフォルトのCHMインスタンスは、バイト配列によって使用される1億バイトより少なくとも5桁少ない空間を使用します。 –
私の主張:CHMは、内部に98%のスペースを占めていませんが、内部にはそれに含まれるものがあります。並列性1を使用することで何も得られません。 –
アプリケーションコードでメモリリークを探す必要があります。誰かがマップにあまりにも多くのものを追加しています。マップをテキストファイルに印刷することができます。 – rghome