У вас либо утечка памяти, либо вы неверно понимаете объем хранимых строковых данных. Мы не можем сказать, что, не видя больше вашего кода.
Научное решение состоит в том, чтобы запустить ваше приложение, используя профилировщик памяти, и проанализировать вывод, чтобы увидеть, какая из ваших структур данных использует неожиданно большой объем памяти.
Если бы я догадался, это было бы, что ваше приложение (на некотором уровне) делает что-то вроде этого:
String line;
while ((line = br.readLine()) != null) {
// search for tag in line
String tagStr = line.substring(pos1, pos2);
// code as per your example
}
Это использует намного больше памяти, чем вы ожидаете. Вызов substring(...)
создает объект tagStr
, который ссылается на базовый массив исходной строки line
. Ваши строки тегов, которые, как вы ожидаете, будут короткими на самом деле , ссылаются на char[]
объект, который содержит все символы в исходной строке.
Исправление заключается в следующем:
String tagStr = new String(line.substring(pos1, pos2));
Это создает объект String, который не использует общий массив аргумента String.
ОБНОВЛЕНИЕ - это или что-то подобное становится все более вероятным объяснением ... учитывая ваши последние данные.
Если говорить о другом аспекте Джона Скита, то накладные расходы небольшой строки удивительно высоки. Например, на типичной 32-битной JVM использование памяти односимвольной строки:
- Заголовок объекта String для объекта String: 2 слова
- Поля строкового объекта: 3 слова
- Заполнение: 1 слово (я думаю)
- Заголовок объекта резервного массива: 3 слова
- Данные резервного массива: 1 слово
Всего: 10 слов - 40 байтов - для хранения одного char
данных ... или одного byte
данных, если ваш ввод находится в 8-битном наборе символов.
(Этого недостаточно, чтобы объяснить вашу проблему, но вы все равно должны об этом знать.)