>  기사  >  Java  >  문자열: Java의 가비지 수집 및 불변성

문자열: Java의 가비지 수집 및 불변성

DDD
DDD원래의
2024-11-07 08:13:03690검색

Strings: Garbage Collection and Immutability in Java

Java에서 문자열은 불변성인터닝 특성으로 인해 메모리 관리에서 독특한 역할을 합니다. 이러한 개념은 성과를 향상시킬 뿐만 아니라 인터뷰에서 종종 필수적인 기억 처리에 뉘앙스를 도입합니다.

문자열 풀 및 JVM 메모리 관리가 이러한 개념과 어떻게 상호 작용하는지에 대한 참고 사항과 함께 가비지 수집불변성을 자세히 살펴보겠습니다.

이 게시물은 문자열 풀 및 메모리 관리에 대한 이전 기사에서 논의한 개념을 바탕으로 작성되었습니다. 해당 기사를 먼저 검토하면 여기에서 다루는 주제를 이해하는 데 도움이 되는 기초가 제공됩니다.


1. 문자열 쓰레기 수거

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" 문자열은 더 이상 참조되지 않으므로 가비지 수집될 수 있습니다.


2. 문자열 불변성

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";
  • concat() 메서드는 피연산자가 리터럴인지 변수인지에 관계없이 항상 런타임 연결을 수행하여 에 새 문자열을 배치합니다.

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 메모리 필수 요소
  • Java 키워드 필수
  • Java OOP 필수
  • 수금 프레임워크 필수

즐거운 코딩하세요!

위 내용은 문자열: Java의 가비지 수집 및 불변성의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.