Здравстуйте.
Есть сервлет, к нему делаются GET-запросы и передаются параметры from и to (UNIX-timestamp) - период, за который нужно вернуть данные.
Данные возвращаются в формате JSON.
В общем случае, каждый элемент возвращаемых данных представляет собой 2 поля - timestamps и data, где timestamps - массив timestamp'ов, где каждый - timestamp начала дня (и все в интервале от from до to, в порядке возрастания; разница между соседними - 86400). А data - массив значений (некоторое число, либо null, если данных за данный день нет; в данном случае 0 - это значение - и важно различать когда 0, а когда null).
Пример:
{
"data": [
25,
null,
35
],
"timestamps":[
1354910400,
1354996800,
1355083200
]
}
1. from округляется до начала дня, to - до начала следующего дня и массив timestamps в цикле заполняется long'ами от from до to с шагом в 86400
2. Вызываются различные методы и результаты записываются в HashMap'ы<Long, Long>, где ключ - timestamp начала дня, а значение - значение на данный день.
3. Создается StringBuilder и для каждого HashMap'а делается:
- пробегаем по всем элементам массива timestamps
- если в текущем HashMap'е элемент по ключу timestamps[n] равен null, то в StringBuilder делаем append(«null»)
- если же на данный день у нас есть данные - append'им их
Потом все переводится в валидный JSON и конце концов делается response.getWriter.print(result) - возвращается результат
В общем-то, все работает, все удобно, но при большом количестве запросов (а каждый запрос довольно тяжелый) - в куче накапливается огромное количество этих HashMap'Ов - они начинают занимать где-то 800МБ.
Т.е. ситуация чревата тем, что heap space кончится. Хотя по сути, данные долго хранить не надо - просто посчитать 1 раз, да вернуть их в respons'е
Вопросы:
1. Как организовать данные и минимизировать затраты памяти? Использовать вместо HashMap'ов обычные массивы (хотя с HashMap'ами работать намного удобнее)?
2. Как эффективно в данном случае работать с памятью? Делать myHashMap.clear() не имеет смысла,так? Вызывать насильно System.gc() - слишком радикально, да и сильно замедлит работу. Как в данном случае быть?
Решат ли проблему WeakReference's?
Спасибо.