Пожалуйста, взгляните на следующий фрагмент кода:

public static void main(String[] args) {
        BufferedReader reader;
        try {
            reader = new BufferedReader(new FileReader(
                    "myfile.txt"));
            String line = reader.readLine();
            while (line != null) {
                System.out.println(line);
                // read next line
                line = reader.readLine();
            }
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

Как видите, каждая строка файла читается и сохраняется в переменной 'line'. Поскольку строка имеет тип string, ее содержимое хранится в пуле строк. Строки, хранящиеся в пуле строк, не собираются сборщиком мусора Java и остаются там на протяжении всего времени существования программы.

Если файл очень большой, пул строк может раздуться. У вас есть идеи, как читать файл без сохранения всех его строк в пуле строк? Я просто должен был хранить строки файла как любой объект, что означает, что он будет удален из кучи, когда он не нужен.

-2
CrazySynthax 11 Ноя 2019 в 21:41
Вы профилировали свой код, чтобы задокументировать, что «раздувание» пула строк вызывает у вас проблему? Если нет, не будет ли это возможной преждевременной оптимизацией?
 – 
Hovercraft Full Of Eels
11 Ноя 2019 в 21:43
Примечание. Я никогда не слышал о "раздувании" пула строк. Есть ли у вас какие-либо ссылки на ссылки по этой проблеме?
 – 
Hovercraft Full Of Eels
11 Ноя 2019 в 21:43
1
Или String(s) вы явно intern(). OP должениспользовать try-with-resources (но этот явный reader.close() просто беспокоит меня).
 – 
Elliott Frisch
11 Ноя 2019 в 21:47
4
«Поскольку строка имеет тип string, ее содержимое хранится в пуле строк», это просто неправильно. Строки не сохраняются в пуле строк, если они не являются константами времени компиляции или вы не вызываете для них intern.
 – 
Andy Turner
11 Ноя 2019 в 21:48
1
В прошлом действительно было две проблемы, связанные с пулом строк. Во-первых, было время, когда все строки в пуле помещались в PermGen фиксированного размера, который изменился с Java 7 (начиная с Java 8, больше нет даже PermGen). Кроме того, пул представляет собой хэш-таблицу фиксированного размера, что может привести к множеству коллизий при чрезмерном использовании, но в Java 7, обновление 40, оно было изменено с 1009 на 60013 (не шучу), что смягчило последствия. Но даже в старых версиях intern() не предотвращал сборку мусора, поэтому добавление в него временных строк только замедляло работу кода.
 – 
Holger
12 Ноя 2019 в 19:05

1 ответ

Только строковые литералы сохраняются в SpringPool по умолчанию до тех пор, пока вы не вызовете метод .interm() объекта String.

В приведенном выше примере переменная 'line' является строковым объектом и не является частью StringPool. Вы использовали строковый литерал "myfile.txt", который будет частью StringPool

1
Lal Mohandas 5 Дек 2019 в 05:27