1. 소개

변수를 선언하거나 객체를 생성 할 때마다 메모리에 저장됩니다. 높은 수준에서 Java는 메모리를 스택과 힙의 두 블록으로 나눕니다 . 두 메모리 모두 특정 유형의 데이터를 저장하고 저장 및 액세스 패턴이 다릅니다.

이 튜토리얼에서는 다양한 매개 변수를 살펴보고 문자열 상수 풀 을 저장하는 데 가장 적합한 영역을 학습 합니다.

2. 문자열 상수 풀

문자열 상수 풀은 특정 메모리 영역입니다. 문자열 리터럴 을 선언 할 때 JVM 은 풀에 개체를 만들고 참조를 스택에 저장합니다. 메모리에 문자열 개체를 만들기 전에 JVM은 메모리 오버 헤드를 줄이기 위해 몇 가지 단계를 수행합니다.

String 상수 풀은 구현에서 Hashmap사용합니다 . Hashmap 의 각 버킷 에는 동일한 해시 코드를 가진 String List이 포함되어 있습니다 . 이전 버전의 Java에서 풀의 스토리지 영역은 고정 된 크기였으며 종종 " 객체 힙을위한 충분한 공간을 예약 할 수 없습니다 오류로 이어질 수있었습니다 .

시스템이 클래스를로드하면 모든 클래스의 문자열 리터럴이 응용 프로그램 수준 풀로 이동합니다. 다른 클래스의 동일한 String 리터럴은 동일한 Object 여야하기 때문 입니다. 이러한 상황에서 풀의 데이터는 의존성없이 각 클래스에서 사용할 수 있어야합니다.

일반적으로 스택은 수명이 짧은 데이터를 저장합니다. 여기에는 로컬 기본 변수, 힙 개체 참조 및 실행중인 메서드가 포함됩니다. 힙은 동적 메모리 할당을 허용하고 런타임에 Java 객체 및 JRE 클래스를 저장합니다.

힙은 전역 액세스를 허용하고 힙의 데이터 저장소는 응용 프로그램의 수명 동안 모든 스레드에서 사용할 수있는 반면 스택의 데이터 저장소에는 개인 범위가 있으며 소유자 스레드 만 액세스 할 수 있습니다.

스택은 연속적인 메모리 블록에 데이터를 저장하고 임의 액세스를 허용합니다. 클래스 에 풀에서 랜덤의 문자열이 필요한 경우 스택의 LIFO (후입 선출) 규칙으로 인해 사용하지 못할 수 있습니다. 반대로 힙은 메모리를 동적으로 할당하고 어떤 방식 으로든 데이터에 액세스 할 수 있도록합니다.

다양한 유형의 변수로 구성된 코드 조각이 있다고 가정 해 보겠습니다. 스택은 int 리터럴 의 값 String 및 Demo 객체의 참조를 저장 합니다 . 모든 객체의 값은 힙에 저장되고 모든 문자열 리터럴은 힙 내부의 풀에 저장됩니다.

스택에 생성 된 변수는 스레드가 실행을 완료하는 즉시 할당 해제됩니다. 반대로 가비지 수집기 는 힙의 리소스를 회수 합니다. 마찬가지로 가비지 수집기는 풀에서 참조되지 않은 항목을 수집합니다.

풀의 기본 크기는 플랫폼에 따라 다를 수 있습니다. 어쨌든 여전히 사용 가능한 스택 크기보다 훨씬 큽니다. JDK 7 이전에는 풀이 permgen 공간의 일부 였고 JDK 7부터 지금까지 풀은 기본 힙 메모리의 일부였습니다.

3. 결론

이 짧은 기사에서는 문자열 상수 풀 의 저장 영역에 대해 배웠습니다 . 스택과 힙은 데이터를 저장하고 액세스하기위한 특성이 다릅니다. 메모리 할당에서 액세스 및 가용성에 이르기까지 힙은 문자열 상수 풀을 저장하는 데 가장 적합한 영역입니다.

사실 풀은 스택 메모리의 일부가 아닙니다.