Том Хоутин (Tom Hawtin) высказал хорошие замечания - я просто хочу расширить их и предоставить немного больше деталей.
Строки Java занимают как минимум 40 байт памяти (это пустая строка) из-за заголовка объекта Java (см.позже) накладные расходы и внутренний байтовый массив.Это означает, что минимальный размер непустой строки (1 или более символов) составляет 48 байт.
В настоящее время JVM использует Compact Strings , что означает, что строки только для ASCII занимают только 1 байт насимвол - до этого было минимум 2 байта на символ.Это означает, что если ваш файл содержит символы, выходящие за пределы набора ASCII, тогда использование памяти может значительно возрасти.
У потоков также больше накладных расходов по сравнению с простой итерацией с массивами / списками (см. Здесь Объекты потока Java 8 значительно расходуют память)
Я полагаю, ваш объект UserModel добавляет как минимум 32 байта в верхней части каждой строки, потому что:
- минимальный размер объекта Java составляет 16 байтов, где первые 12байты - это «издержки» JVM: ссылка на класс объекта (4 байта, когда используется сжатые значения ) + слово Mark (используется для хэш-кода идентификатора, смещенная блокировка , сборщики мусора)
- и следующие 4 байта используются ссылкой на первый «токен»
- , а следующие 12 байтов используются 3 ссылками на второй, третий и четвертый «токен»
- и последние 4 байта требуются из-за выравнивания объектов Java на 8-байтовых границах (на 64-разрядных архитектурах)
При этом этоНепонятно, используете ли вы все данные, которые вы читаете из файла - вы разбираете 4 токена со строки, но, возможно, их больше?Более того, вы не упомянули, как именно «вырос» размер кучи - если это был размер commited
или размер кучи used
.Часть used
- это то, что на самом деле «используется» живыми объектами, часть commited
- это то, что было выделено JVM в какой-то момент, но позже может быть собрано мусором;used < commited
в большинстве случаев.
Вы должны сделать снимок кучи, чтобы узнать, сколько памяти на самом деле занимает результирующий набор UserModel
, и это было бы действительно интересно сравнить с размеромфайл.