2011-07-04 3 views
6

은 다음 MSDN:CLR/JVM은 실행중인 모든 .net/java 앱에 대해 하나의 인턴 풀을 유지합니까?

에서 추출물 공용 언어 런타임 테이블을 유지함으로써 문자열 저장을 보존, 선언 또는 생성 된 각각의 고유 한 리터럴 문자열에 하나의 참조를 포함하는, 인턴 풀라고 프로그래밍 방식으로 프로그램에서. 결과적으로 리터럴 문자열의 특정 문자열 (예 : )이 시스템에 한 번만 존재합니다.

은 여러 변수에 동일한 리터럴 문자열을 할당 할 경우 예를 들어, 런타임 인턴 풀에서 리터럴 문자열에 동일한 참조를 검색하고 각 변수에 할당합니다.

Intern 메서드는 인턴 풀 을 사용하여 str 값과 동일한 문자열을 검색합니다. 이러한 문자열이 있으면 인턴 풀의 해당 참조는 입니다. 문자열에 이 없으면 str에 대한 참조가 인턴 풀에 추가되고 해당 참조 이 반환됩니다. 당신이 하려고하는 경우 .... 문자열을 인턴 것은 두 원치 않는 부작용이 있다는 점 유지, 메모리의 총량 당신의 애플리케이션 할당을 줄일 수 있습니다. 첫째, 공용 언어 런타임 (CLR)이 종료 될 때까지 메모리가 인계 된 문자열 개체에 할당되어 으로 릴리스 될 가능성이 없습니다.

CLR이 실행중인 모든 .net 앱에 대해 하나의 인턴 풀을 유지한다는 의미입니까? 예제 : 프로그램 A가 "Test"라는 문자열 리터럴을 만들고 다른 프로그램이 "Test"라는 다른 문자열 리터럴을 만들려고한다면 같은 복사본이 사용됩니까? 같은 질문이 JVM에도 적용됩니다.

답변

2

CLR은 인스턴스 당 인턴 풀을 유지합니다. 아래쪽을 읽는 경우 MSDN link :

응용 프로그램에서 할당하는 총 메모리 양을 줄이려면 문자열을 사용하면 두 가지 원치 않는 부작용이 있음을 기억하십시오. 첫째, 인턴 된 String 객체에 할당 된 메모리는 CLR (공용 언어 런타임)이 종료 될 때까지 해제되지 않습니다.

Java의 경우 시작하는 JVM에도 해당됩니다. 그러나 this article에 따라

는 :

이 신화는 어떤 사람들이 JVM이 끝날 때까지 내면화 된 문자열이 메모리에 남아 있음을 보라 신화 (2)의 반대 방향으로 간다. 그것은 오래 전에 사실되었을 수도 있지만 더 이상 참조하지 않을 경우 오늘 내면화 문자열은 쓰레기 수집됩니다. 위의 프로그램을 약간 수정 한 버전을보십시오. 내부화 된 문자열에 대한 참조를 수시로 지 웁니다.jconsole에서 프로그램 실행을 수행하면 가비지 수집기가 참조되지 않은 내부화 된 문자열에 사용 된 메모리를 회수하기 때문에 PermGen 공간 사용이 위아래로 이동하는 것을 볼 수 있습니다.

Java interned 문자열에서 실제로 GCed를 얻을 수 있다는 것을 의미합니다.

+1

링크가 있습니까? –

1

아니요.
각 앱은 고유 한 가상 메모리 공간에서 실행됩니다. 두 메모리 공간간에 데이터를 공유 할 수 없습니다.
로드/언로드 시퀀스를 고려하십시오. 그것은 매우 복잡해질 것이고 당신은 결코 문자열을 제거 할 수 없을 것입니다.
또한 견적의이 부분을주의 :

선언 또는 프로그램에서 프로그래밍 방식으로 생성 된 각각의 고유 한 리터럴 문자열. 당신의 신청 후 지속 할 수 구금 String 객체에

CLR에의 참조를, 또는 응용 프로그램 도메인 :


확인, 그냥 MSDN 페이지에서 조금 더 읽기 종료됩니다.

+0

Holterman - MSDN의 회선 - 먼저 공용 언어 런타임 (CLR)이 종료 될 때까지 인턴 된 String 개체에 할당 된 메모리가 해제 될 가능성이 없습니다. CLR에 대한 것 같습니다 –

+0

@PK : "해당 프로그램의 CLR 인스턴스"로 읽었습니다. –

0

Java의 경우 그렇습니다. 문자열 리터럴은 JVM 당 풀로 유지됩니다. JavaDoc에서 발췌 한 내용 String#intern() : All literal strings and string-valued constant expressions are interned. String literals are defined in §3.10.5 of the Java Language Specification

+0

그들은 응용 프로그램 당 또는 전체 JVM에 인턴됩니까? –

+0

내가 아는 한 JVM 당 하나의 풀이있다. 그러나 정상적인 경우에는 애플리케이션 당 하나의 JVM을 가질 가능성이 높습니다. 이는 애플리케이션의 정의에 달려 있습니다. 서버 환경에서 애플리케이션 서버는 하나의 JVM에서 실행되며 여러 (하위) 애플리케이션을 호스팅 할 수 있습니다. – Thomas

+0

여러 인턴 풀이있을 수 있는지 여부에 관계없이 각 클래스 (예 : 서블릿 컨테이너)에 대해 별도의 클래스 로더를 사용하는 여러 응용 프로그램을 실행하는 JVM에 대한 질문이 있다고 생각합니다. 이는 다른 클래스 로더로 java.lang.String을 여러 번로드 할 수 있는지 묻는 것과 같습니다. –

0

CLD는 AppDomain이 아닌 런타임마다 하나씩 제공됩니다. 제프리 리히터의 "CLR 통해 C#을"

주에서 가비지 컬렉터는 내부 해시 테이블은 해시 테이블 그 String 객체에 대한 참조를 보유하고 있기 때문에 참조하는 문자열을 해제 할 수 없습니다. 내부 해시 테이블에서 참조하는 String 개체는 AppDomain이 언로드되거나 프로세스가 종료 될 때까지 해제 할 수 없습니다.

이는 테이블이 AppDomain과 구분되어 있음을 나타냅니다.

JVM에는이 개념이 없으므로 애매 모호하지 않습니다. 다른 클래스 로더가있을 수 있지만 String에 대해 다른 클래스 로더가 있다고 상상하기는 어렵습니다.

관련 문제