Если строка во время компиляции определена как литерал [например: String str = "java";
], то будет ли это сбор мусора?
Возможно, нет. Объекты кода будут содержать одну или несколько ссылок на объекты String
, которые представляют литералы. До тех пор, пока объекты кода достижимы, объекты String
будут.
Возможно, объекты кода станут недоступными, но только если они были динамически загружены ... и их загрузчик классов уничтожен.
Если я использую метод intern [e.g: String str = new String("java").intern()
], тогда это будет сбор мусора?
Объект, возвращенный intern
вызов будет тот же объект, который представляет собой "java"
строка символов. (The "java"
буквальным интернирован во время загрузки класса. Когда вы затем стажер недавно построенный String
объект в фрагмент кода, он будет искать и возвращать ранее интернирован "java"
строку.)
Однако интернированные строки, которые не совпадают с строковые литералы может быть собранным мусором, как только они становятся недоступными. Местом PermGen является мусор, собранный на всех последних JSM HotSpot. (До Java 8 ... который падает PermGen полностью.)
Также он будет относиться по-разному из строкового литерала в пункте 1.
... Нет, потому что это тот же объект, строковый литерал.
И действительно, как только вы поймете, что происходит, ясно, что струнные литералы также не обрабатываются специально. Это просто применение «достижимость» правила ...
В некоторых местах упоминаются, что литералы будут мусор только тогда, когда String
класса будет выгружен? Имеет ли смысл, потому что я не думаю, что класс String
будет выгружен.
Вы правы. Это не имеет смысла. Источники, которые сказали, что неверны. (Было бы полезно, если бы вы разместили URL-адрес, чтобы мы могли прочитать, что они говорят для себя ...)
1 - http://stackoverflow.com/questions/2202162/garbage-collection-and-strings; 2 - http://stackoverflow.com/questions/6470651/creating-a-memory-leak-with-java; 3 - String a = new String («asd») -> «a» ссылка будет собрана мусором, но это просто ссылка на «asd» и «asd» будет навсегда. – user1050755
Если вы ищете больше, вы найдете места, упоминающие, что строковые литералы, созданные с использованием intern, могут быть собраны в мусор, поскольку они используют слабую ссылку, но я не могу подтвердить это, и именно по этой причине я опубликовал ее, так как есть много смешанных ответов. – Lokesh