Трудно сказать, что именно происходит, не видя больше вашего кода.Это также немного сбивает с толку, так как ваш BufferedReader
, похоже, не используется.
Тем не менее, одна возможность, учитывая то, что, по вашему мнению, вы делаете, заключается в том, что где-то вы вызываете substring
для некоторого текставвод и сохранение ссылки на объект String
, который возвращается в результате.Например, вы можете делать что-то вроде этого:
List<String> allMySubstrings = new ArrayList<String>();
while((line = input.readLine()) != null){
String mySubstring = line.subString(40, 42);
// mySubstring still has a reference to the whole character array from line
allMySubstrings.add(mySubstring);
}
Тогда вы можете подумать, что у вас будут только ссылки на allMySubstrings
, а не на каждый line
, который был прочитан.Однако из-за способа реализации subString
результирующий объект String
будет иметь ссылку на весь исходный массив символов из line
, а не только на соответствующую подстроку.Сборка мусора не произойдет, как вы могли ожидать в результате
Если вы делаете это, вы можете обойти это, создав новый String object
:
List<String> allMySubstrings = new ArrayList<String>();
while((line = input.readLine()) != null){
String mySubstring = new String(line.subString(40, 42));
allMySubstrings.add(mySubstring);
}
Обратите внимание, что этоможет происходить, даже если вы не явно вызываете subString
, так как общие методы, такие как split
, могут быть ответными.