Programing

Java에서 문자열이 가비지 수집되는 경우

lottogame 2020. 12. 9. 07:42
반응형

Java에서 문자열이 가비지 수집되는 경우


Java에서 객체에 라이브 참조가 없으면 가비지 수집에 적합합니다. 이제 문자열의 경우 문자열이 문자열 풀에 들어가고 JVM이 객체를 재사용 할 수 있도록 유지하기 때문에 그렇지 않습니다. 그러면 한 번 생성 된 문자열이 가비지 수집되지 않을 것임을 의미합니까?


이제 문자열의 경우 문자열이 문자열 풀에 들어가고 JVM이 객체를 재사용 할 수 있도록 유지하기 때문에 그렇지 않습니다. 그러면 한 번 생성 된 문자열이 가비지 수집되지 않을 것임을 의미합니까?

첫째,은 단지 문자열 리터럴 자동으로 인턴 / 문자열 풀에 추가됩니다 (참고 참조). String응용 프로그램에서 명시 적으로 호출하지 않는 한 런타임에 응용 프로그램에서 만든 객체는 인턴되지 않습니다 String.intern().

둘째, 실제로 문자열 풀의 가비지 수집 개체에 대한 규칙은 다른 String개체 와 동일 합니다. 실제로 모든 개체입니다. 도달 할 수 없게되면 가비지 수집됩니다.

실제로 String문자열 리터럴에 해당하는 개체는 일반적으로 가비지 수집 대상이되지 않습니다. 이는 리터럴을 사용하는 모든 메서드의 코드에 객체에 대한 암시 적 참조 가 있기 때문입니다 String. 이는 String메소드가 실행될 수있는 에 도달 할 수 있음을 의미합니다 .

그러나 항상 그런 것은 아닙니다 . 동적으로로드 된 클래스에 문자열 리터럴이 정의 된 경우 (예 :를 사용하여 Class.forName(...)) 클래스가 언로드 되도록 정렬 할 수 있습니다 . 이 경우 String리터럴에 해당 하는 객체 도달 할 수 없으며 궁극적으로 GC가 될 수 있습니다.

참고 항목 : Java에서 클래스 가비지 수집시기 및 방법


메모:

  1. 문자열 리터럴 ( JLS 3.10.5 )은 Java 소스 코드에 나타나는 문자열입니다 . 예 :

      "abc"            // string literal
      new String(...)  // not a string literal
    
  2. (컴파일 시간) 상수 표현식 ( JLS 15.28 )의 평가에 의해 생성 된 문자열 도 인턴 될 수 있습니다.

      "abc" + 123                   // 123 is a constant expression
      "abc" + Integer.valueOf(123)  // Integer.valueOf(123) is also
                                    // a constant expression
    
  3. 엄밀히 말하면 모든 문자열 리터럴이 인턴 된 것은 아닙니다. 문자열 리터럴이 상수 표현식의 하위 표현식으로 만 소스 코드에 나타나는 경우 리터럴은 어떤 형식으로도 ".class"파일 나타나지 않을 수 있습니다 . 그러한 리터럴은 런타임에 존재하지 않기 때문에 인턴되지 않습니다.


당신이 올바른지; 인턴 풀의 문자열은 GC 처리되지 않습니다.

그러나 대부분의 문자열은 인턴이 아닙니다.
문자열 리터럴 은 인턴되고 전달 된 문자열 String.intern()은 인턴되지만 다른 모든 문자열은 인턴되지 않으며 정상적으로 GC 될 수 있습니다.

참고 URL : https://stackoverflow.com/questions/18406703/when-will-a-string-be-garbage-collected-in-java

반응형