Проще говоря, объем памяти, необходимый для хранения строк (и всего остального в вашей программе), превысил общий объем свободной памяти, доступной в куче.
Другие списки будут иметь несколько разные объемы служебной информации, но в действительности требования к памяти самой структуры, вероятно, будут незначительными по сравнению с данными, которые она содержит. Другими словами, переключение на другую реализацию списка может позволить вам прочитать еще несколько строк, прежде чем упасть, но это не решит проблему.
Если вы не увеличили пространство кучи Java-приложения, оно может работать с довольно низкими значениями по умолчанию. В этом случае вам следует рассмотреть возможность предоставления следующего аргумента командной строки для вызова java
:
-Xmx512m
(где 512m
подразумевает 512 мегабайт пространства кучи; вы можете использовать, например, -Xmx2g
или все, что вы считаете подходящим.)
С другой стороны, если вы уже работаете с большой кучей (намного больше, чем общий размер строк, которые вы хотите сохранить в памяти), это может указывать на проблему с памятью где-то еще. Сколько персонажей в книге? Для хранения всех строк потребуется по крайней мере в два раза больше байтов, и, вероятно, на 20% или более, чтобы учесть накладные расходы. Если ваши расчеты показывают, что ваше текущее пространство кучи должно содержать все эти данные, в других местах могут возникнуть проблемы. В противном случае вы теперь знаете, что вам нужно для увеличения кучи как минимум.
(Кроме того, попытка обработать большие объемы ввода в виде одного пакета часто может привести к проблемам с памятью - что, если вы хотите обработать текстовый файл объемом 8 ГБ? Часто лучше обрабатывать меньшие фрагменты последовательно, в некотором роде Например, если вы хотите прописать каждый символ в верхнем регистре и записать его обратно в другой файл, вы можете сделать это по одной строке за раз, а не сначала читать всю книгу в память.)