2013-10-03 2 views
2

내가 String 개체 많이 intern()를 생성하는 프로그램을 작성한다고 가정 그들 :임의의 수의 String 객체를 만들면 JVM의 PermGen 공간이 부족합니까?

String someString = param1 + param2; 
someString.intern(); 

이 작은 문자열의 집합하지만 내가 억 String의를 만들려고하면 괜찮지? (또는 그 문제에 대한 억 * 억?) 는 지금까지 내가 알고있는 JVM이 GC -ed하지 않습니다 String들과 PermGenPermGen 지역의 정수 풀을 유지합니다. 내가 루프에서 String 객체의 과도한 수를 만들 수 있지만 내가 그들에 대한 참조를 삭제하는 경우

그래서 그들은 (나는 PermGen 공간 부족하게됩니다) GC이 -ed받을 수 있습니까? String은 중복되지 않고 모두 고유합니다.

답변

8

Java 6에서는 PermGen을 채울 수 있으며 정리됩니다.

Java 7에서 인턴 된 문자열은 PermGen에 없지만 힙에 있습니다.

Java 8에는 PermGen이 없습니다.

리터럴 풀에는 새로운 리터럴이 없으므로 처음에는 풀에 있지 않으므로 리터럴 풀에만 상수가 포함되어 있습니다.

참고 : 문자열 리터럴 해시 맵의 크기가 조정되지 않습니다. 일반적으로 기본적으로 약 10K 개 요소입니다. 엔트리를 추가함에 따라 연결된 목록의 배열로 변하면서 느려지고 느려집니다.

+1

Java 7에 저장되는 위치는 어디입니까? – Marcelo

+0

젠장, 자바의 최신 버전에 대한 자세한 내용은 너무 복잡합니다. – Kayaman

+0

내 질문을 편집했습니다. 좋은 지적. –

3

아니요. 표시하려는 내용은 리터럴 구문이 아닙니다.

String myString = "a literal String"; 

리터럴 구문일까요? 그러나 String.intern() 메서드를 사용하여 모든 문자열을 상수 풀에 넣을 수 있습니다. 초과 량의 스트링을 인턴으로 인턴 할 때 어떤 일이 일어나는지 직접 테스트 할 수 있습니다.

관련 문제