Когда строка будет мусором, собранным в java

В Java, когда объект не имеет живой ссылки, он имеет право на garbage collection. Теперь в случае строки это не так, потому что строка войдет в пул строк, а JVM сохранит объект для повторного использования. Итак, это означает, что некогда созданная строка будет «никогда» не собираться мусором?

Теперь в случае строки это не так, потому что строка войдет в пул строк, а JVM сохранит объект для повторного использования. Итак, это означает, что некогда созданная строка будет «никогда» не собираться мусором?

Во-первых, это только строковые литералы 1, которые автоматически includeся / добавляются в пул строк. Строки, созданные приложением, не интернированы … если ваше приложение явно не вызывает String.intern() .

Во-вторых, на самом деле правила для сбора мусора в пуле String такие же, как и для других строк / других объектов. Строки будут собирать мусор, если они когда-либо станут недоступными.

На практике объекты String, которые соответствуют строковым литералам, обычно не становятся кандидатами на garbage collection. Это связано с тем, что существует неявная ссылка на строковый объект в коде каждого метода, который использует литерал. Это означает, что String достижима до тех пор, пока метод может быть выполнен.

Однако это не всегда так. Если литерал был определен в classе, который был динамически загружен (например, используя Class.forName(...) ), тогда можно организовать, что class выгружен . Если это произойдет, объект String для литерала будет недоступен и будет восстановлен, когда куча, содержащая интернированную строку, получит GC’ed.


1 – Неверно говорить, что все строковые литералы интернированы. Если строковый литерал появляется только в исходном коде в качестве подвыражения выражения константы (времени компиляции) ( JLS 15.28 ), тогда литерал не будет отображаться в файле «.class» в любой форме . Такой литерал не будет интернирован, потому что он не будет существовать во время выполнения.

Ты прав; строки в пуле пользователя никогда не будут GC’d.

Тем не менее, большинство строк не интернировано.
Строковые литералы интернированы, а строки, переданные в String.intern() , интернированы, но все остальные строки не интернированы и могут быть GC’d в обычном режиме.

  • Преобразование std :: __ cxx11 :: string в std :: string
  • byte в hex string
  • XML-документ для строки
  • Хранить в NSUserDefaults
  • .NET / C # - преобразовать char в строку
  • Использование локалей с Java toLowerCase () и toUpperCase ()
  • Преобразование строки в int C ++
  • Извлечь всю строку из проекта java
  • Каковы все escape-символы?
  • Regex: как получить слова из строки (C #)
  • Использовать строку в корпусе переключателя в java
  • Interesting Posts
    Давайте будем гением компьютера.