Java에서 문자열은 불변성 및 인터닝 특성으로 인해 메모리 관리에서 독특한 역할을 합니다. 이러한 개념은 성과를 향상시킬 뿐만 아니라 인터뷰에서 종종 필수적인 기억 처리에 뉘앙스를 도입합니다.
문자열 풀 및 JVM 메모리 관리가 이러한 개념과 어떻게 상호 작용하는지에 대한 참고 사항과 함께 가비지 수집 및 불변성을 자세히 살펴보겠습니다.
이 게시물은 문자열 풀 및 메모리 관리에 대한 이전 기사에서 논의한 개념을 바탕으로 작성되었습니다. 해당 기사를 먼저 검토하면 여기에서 다루는 주제를 이해하는 데 도움이 되는 기초가 제공됩니다.
Java에서 문자열 리터럴은 GC(가비지 수집) 측면에서 다르게 동작합니다.
1. 문자열 풀의 참조되지 않은 리터럴
String string3 = "World"; // Stored in String Pool // A new string is created in the pool due to case-sensitivity string3 = "WORLD";
이 예에서 string3이 재할당되더라도 원래 "World"는 여전히 String Pool에 있습니다.
JVM은 참조되지 않은 리터럴을 풀에 보존하여 향후 재사용이 가능하지만 이러한 리터럴은 일반 힙 객체처럼 가비지 수집 대상이 아닙니다.
2. 힙 개체
String str1 = new String("World"); // Stored in Heap // String Pool reference is used now // leaving the previous "World" eligible for GC in Heap str1 = "WORLD";
new로 생성된 문자열은 String Pool 대신 힙으로 이동합니다.
str1과 같이 참조가 변경되면 힙에서 사용되지 않은 "World" 문자열은 더 이상 참조되지 않으므로 가비지 수집될 수 있습니다.
Java의 문자열은 변경할 수 없습니다. 일단 생성되면 수정할 수 없습니다. "수정"을 하면 기존 문자열 개체가 변경되지 않고 새 문자열 개체가 생성됩니다.
1. 컴파일 시간 연결(리터럴을 사용한 최적화)
String string5 = "This" + "String";
리터럴을 연결할 때 Java 컴파일러는 컴파일 시간에 연결을 수행하여 최적화합니다.
결과 문자열("ThisString")은 힙을 완전히 피하면서 문자열 풀에 직접 저장됩니다.
이 프로세스는 Constant Pool Folding이라고도 합니다.
2. 런타임 연결(최적화 없음)
String string1 = "Hello"; string1 = string1 + "Hello"; // Stored in Heap
하나 이상의 피연산자가 변수(리터럴이 아님)인 경우 런타임에서 연결이 발생하여 문자열 풀에 상주하지 않는 힙 개체가 생성됩니다. .
예: 원본 "Hello" 리터럴은 풀에 남아 있지만 연결된 "HelloHello" 문자열은 힙에 저장되어 원본 "Hello"의 불변성을 확인합니다.
3. concat() 메소드 사용
String string3 = "World"; // Stored in String Pool // A new string is created in the pool due to case-sensitivity string3 = "WORLD";
4. intern() 메소드 적용
String str1 = new String("World"); // Stored in Heap // String Pool reference is used now // leaving the previous "World" eligible for GC in Heap str1 = "WORLD";
프로세스:
먼저 concat() 작업은 string3이 처음에 참조하는 "World Says Hello" 값을 사용하여 힙에 새 문자열을 생성합니다.
intern()을 호출하면 이 값이 String Pool에 이미 있는지 확인합니다. 그렇지 않은 경우 풀에 값을 추가하고 풀링된 인스턴스에 대한 참조를 반환합니다.
intern()을 호출한 후 string3은 문자열의 풀링된 복사본을 가리킵니다. 이제 활성 참조가 없는 원래 힙 인스턴스는 가비지 수집 대상이 되어 불필요한 메모리 사용량을 줄입니다.
이러한 원칙을 이해하고 활용함으로써 Java 개발자는 메모리 효율적이고 성능이 뛰어난 코드를 작성할 수 있습니다.
즐거운 코딩하세요!
위 내용은 문자열: Java의 가비지 수집 및 불변성의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!