Я пытаюсь исправить проблему утечки памяти. Анализ дампа кучи показывает, что ConcurrentHashMap
занимает около 98% of heap memory
. Проверяли код, и получается, что создание экземпляра ConcurrentHashMap
использует конструктор без параметров. Конфигурация по умолчанию для concurrencyLevel равна 16. После этого создания карты я вижу синхронизированный вызов метода, где данные помещаются на карту.Уровень параллелизма для ConcurrentHashMap в синхронизированном методе
Я хотел бы знать, что, поскольку данные помещаются только в синхронизированном методе, безопасно ли устанавливать параметр concurrencyLevel ConcurrentHashMap
в 1?
Ниже приводится пример фрагмент кода:
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 по умолчанию использует по меньшей мере на 5 порядков меньше пространства, чем 100 миллионов байтов, используемых байтом. –
Моя точка: CHM не занимает 98% пространства с его внутренностями, но с материалом, который он содержит. Вы не получите ничего, используя параллелизм 1. –
Вам нужно искать утечку памяти в коде приложения. Кто-то добавляет слишком много материала на карту - просто. Вы всегда можете попробовать распечатать карту в текстовом файле. – rghome