Java에서 문자열이 가비지 수집되는 경우
Java에서 객체에 라이브 참조가 없으면 가비지 수집에 적합합니다. 이제 문자열의 경우 문자열이 문자열 풀에 들어가고 JVM이 객체를 재사용 할 수 있도록 유지하기 때문에 그렇지 않습니다. 그러면 한 번 생성 된 문자열이 가비지 수집되지 않을 것임을 의미합니까?
이제 문자열의 경우 문자열이 문자열 풀에 들어가고 JVM이 객체를 재사용 할 수 있도록 유지하기 때문에 그렇지 않습니다. 그러면 한 번 생성 된 문자열이 가비지 수집되지 않을 것임을 의미합니까?
첫째,은 단지 문자열 리터럴 자동으로 인턴 / 문자열 풀에 추가됩니다 (참고 참조). String
응용 프로그램에서 명시 적으로 호출하지 않는 한 런타임에 응용 프로그램에서 만든 객체는 인턴되지 않습니다 String.intern()
.
둘째, 실제로 문자열 풀의 가비지 수집 개체에 대한 규칙은 다른 String
개체 와 동일 합니다. 실제로 모든 개체입니다. 도달 할 수 없게되면 가비지 수집됩니다.
실제로 String
문자열 리터럴에 해당하는 개체는 일반적으로 가비지 수집 대상이되지 않습니다. 이는 리터럴을 사용하는 모든 메서드의 코드에 객체에 대한 암시 적 참조 가 있기 때문입니다 String
. 이는 String
메소드가 실행될 수있는 한 에 도달 할 수 있음을 의미합니다 .
그러나 항상 그런 것은 아닙니다 . 동적으로로드 된 클래스에 문자열 리터럴이 정의 된 경우 (예 :를 사용하여 Class.forName(...)
) 클래스가 언로드 되도록 정렬 할 수 있습니다 . 이 경우 String
리터럴에 해당 하는 객체 는 도달 할 수 없으며 궁극적으로 GC가 될 수 있습니다.
참고 항목 : Java에서 클래스 가비지 수집시기 및 방법
메모:
문자열 리터럴 ( JLS 3.10.5 )은 Java 소스 코드에 나타나는 문자열입니다 . 예 :
"abc" // string literal new String(...) // not a string literal
(컴파일 시간) 상수 표현식 ( JLS 15.28 )의 평가에 의해 생성 된 문자열 도 인턴 될 수 있습니다.
"abc" + 123 // 123 is a constant expression "abc" + Integer.valueOf(123) // Integer.valueOf(123) is also // a constant expression
엄밀히 말하면 모든 문자열 리터럴이 인턴 된 것은 아닙니다. 문자열 리터럴이 상수 표현식의 하위 표현식으로 만 소스 코드에 나타나는 경우 리터럴은 어떤 형식으로도 ".class"파일 에 나타나지 않을 수 있습니다 . 그러한 리터럴은 런타임에 존재하지 않기 때문에 인턴되지 않습니다.
당신이 올바른지; 인턴 풀의 문자열은 GC 처리되지 않습니다.
그러나 대부분의 문자열은 인턴이 아닙니다.
문자열 리터럴 은 인턴되고 전달 된 문자열 String.intern()
은 인턴되지만 다른 모든 문자열은 인턴되지 않으며 정상적으로 GC 될 수 있습니다.
참고 URL : https://stackoverflow.com/questions/18406703/when-will-a-string-be-garbage-collected-in-java
'Programing' 카테고리의 다른 글
다중 스레드 C ++ 11 프로그램에서 예외가 처리되지 않으면 어떻게됩니까? (0) | 2020.12.09 |
---|---|
Java의 toLowerCase () 및 toUpperCase ()와 함께 로케일 사용 (0) | 2020.12.09 |
git rm-치명적 : 경로 사양이 파일과 일치하지 않음 (0) | 2020.12.09 |
.NET Core로 이미지 조작 (0) | 2020.12.09 |
오류 : com.google.gms : google-services : 4.2.0을 찾을 수 없습니다. (0) | 2020.12.09 |