Трудно понять, что вы на самом деле спрашиваете здесь, но приложение ведет себя именно так, как я и ожидал.
Строки являются неизменяемыми, и сборщик мусора их не выводит.не так ли
Как изменяемые, так и неизменяемые объекты могут собираться мусором в Java.
Критерий фактический , который определяет, является ли объект фактически собранным мусором, является ли он достижимостью .Проще говоря, когда сборщик мусора выяснит, что приложение больше не может использовать объект, объект будет удален.
В обоих ваших приложениях объекты примерно одинакового размера создаются один раз каждые 10миллисекунды.На каждой итерации создается новый объект, и его ссылка присваивается s
, заменяя предыдущую ссылку.Это делает предыдущий объект недоступным и пригодным для сборки мусора.В какой-то момент Java VM решает запустить сборщик мусора.Это избавляет от всего недоступного объекта ... и приложение продолжается.
Я читал, что общие строки никогда не собираются сборщиком мусора, не так ли?
Это ложно по двум причинам:
Строки, созданные new String(...)
, String.substring(...)
1 и т. Д., Не являютсяотличается от любого другого объекта Java.
Строки, которые интернированы (путем вызова String.intern()
), хранятся в пуле строк, который содержится в куче PermGen 2 .Однако даже куча PermGen собирается мусором, хотя и в более длительные сроки, чем куча, в которой обычно создаются объекты.
(Когда-то куча PermGen не собиралась,но это было изменено давно.)
Как правильно идентифицировал @MichaelBorgwardt, вы путали строковые объекты (в общем) со строковыми объектами, которые соответствуют строковым литералам.Последние интернируются автоматически и попадают в пул строк.Тем не менее, они все еще могут быть предметом сбора мусора.Это может произойти, если родительский класс выгружен и ничто иное не ссылается на литерал.
1 - В Java 6 и более ранних версиях есть разница между строками, созданными с использованием new String
и использованием String.substring
.В последнем случае исходная строка и подстрока будут иметь общий массив, содержащий символы строки.В Java 7 это изменилось.String.substring
теперь создает новый резервный массив.
2 - Начиная с Java 7, пул строк - это просто (скрытая) структура данных в обычной куче.Начиная с Java 8, куча PermGen больше не существует.