2012-04-19 5 views
9

자바에서,문자열 풀의 크기가 초과하면 어떻게됩니까? 문자열 상수 수영장에서

문자열 리터럴 쓰레기 수집하지 않습니다, 그들은 공간을 최적화하기 위해 런타임의 인스턴스에 의해 생성 참조 테이블에서 참조하고 있기 때문에.

문자열 리터럴 풀의 크기가 0보다 큰 경우 문자열 리터럴 풀의 각 문자열은 참조를 가지므로 GC에는 적합하지 않으므로 JVM에서 어떻게 처리됩니까?

+2

상수 풀의 문자열은 가비지 수집 될 수 있습니다 더 이상 필요 없습니다 (즉, 클래스를 언로드 한 클래스). –

+0

문자열 풀의 크기가 * * *를 초과하는 경우? – EJP

답변

3

더 이상 필요없는 문자열 리터럴을 수집 할 수 있습니다. 일반적으로 클래스에 많은 수의 클래스를로드하려고하면 도달 할 수있는 다른 제한이 있기 때문에 클래스에 표시되는 경우 문제가되지 않습니다. 최대 Perm Gen 일반적으로 말하자면, 개발자는 문자열 리터럴 풀을 과도하게 사용하지 않고 데이터베이스 또는 파일을 사용하여 대용량의 데이터를로드하는 것이 현명합니다.

시스템의 공간을 최적화하기 위해 String.intern()을 많이 사용하면 문제가 발생할 수 있습니다. String.intern()은 무료가 아니며 많은 수 (수백만) 개의 문자열을 추가하면 점점 더 비싸집니다. 이것이 성능상의 문제라면 개발자가있을 때 합리적으로 분명해야합니다.

10

JavaRanch에 실제 코드 예제가 포함 된 긴 토론이 있습니다. 더 이상 사용 후 수집되지 문자열 String.intern을 사용하여 런타임 상수 풀에 추가

  1. 경우()은 될 수 쓰레기 :

    일반적인 출력은 다음과 같은 것이있다. 아마도 문자열 풀은 추가 된 문자열에 대한 소프트 참조 만 유지하므로 문자열을 가비지 수집 할 수 있습니다 (String.intern()은 기본 메서드이므로).

  2. 문자열이 COMPILE 시간 상수이면 해당 클래스의 상수 풀에 추가됩니다. 따라서 클래스가 언로드 된 후에 만 ​​가비지 수집 될 수 있습니다.

귀하의 질문에 대한 대답은 문자열 상수로 인해 OutOfMemoryError를 얻는 유일한 방법은 컴파일시 계산 된 많은 문자열 리터럴을 사용하여 많은 클래스를로드하는 것입니다. 그러면 결국 PermGen 공간의 최대 크기를 초과 할 수 있습니다. 하지만 클래스를 메모리에로드 할 때 (예 : 응용 프로그램 시작, 웹 서버에 프로젝트 배포, 새 라이브러리로드 등) 발생합니다.

관련 문제