메모리 영역

static 변수는 JVM의 메모리 구조에서 메소드 영역(Method Area)에 저장됩니다.

메소드 영역은 클래스 로더에 의해 클래스가 처음 로딩될 때 클래스 메타데이터, 메소드 데이터, 그리고 static 변수 등을 저장하는 공간입니다.

생명주기

static 변수의 생명주기는 클래스의 생명주기와 동일합니다.

클래스가 JVM에 의해 로드될 때 static 변수는 초기화되고, JVM이 종료되거나 클래스가 언로드될 때까지 존재합니다.

클래스 로딩: 클래스가 처음 로딩될 때, static 변수는 초기화됩니다. 이 시점에 Maps.newHashMap()이 호출되어 새로운 HashMap 인스턴스가 생성되고, users 변수에 할당됩니다.

클래스 사용: 클래스가 사용되는 동안, static 변수는 모든 인스턴스에서 공유됩니다. 즉, 이 클래스의 모든 인스턴스는 동일한 users 맵을 참조합니다.

클래스 언로딩: JVM은 보통 애플리케이션이 종료될 때까지 클래스를 언로드하지 않지만, 특정 조건 하에서는 언로드할 수 있습니다. 이 경우 static 변수도 메모리에서 해제됩니다. 일반적으로, 이는 애플리케이션 종료 시 발생합니다.

관리

static 변수는 애플리케이션의 전역 상태를 나타낼 수 있기 때문에 관리에 주의가 필요합니다. 일반적으로 다음과 같은 점에 유의해야 합니다.

동기화: 멀티스레드 환경에서 static 변수에 대한 동시 접근이 있을 경우, 동기화 문제가 발생할 수 있습니다. 이 경우 synchronized 키워드나 ConcurrentHashMap과 같은 동시성 컬렉션을 사용하는 것이 좋습니다.

메모리 누수:static 변수는 클래스가 언로드되기 전까지 메모리에 유지되기 때문에, 대량의 데이터를 저장할 경우 메모리 누수가 발생할 수 있습니다. 불필요한 데이터는 적절히 제거하여 메모리 사용을 관리해야 합니다.

테스트:static 변수는 상태를 유지하기 때문에, 단위 테스트 시 초기화 및 정리에 신경 써야 합니다. 테스트 간의 독립성을 유지하기 위해 테스트 전후에 static 변수를 초기화하는 것이 좋습니다.

결론적으로, static 변수는 클래스와 함께 로딩되며, 클래스가 언로드되거나 JVM이 종료될 때까지 메모리에 남아 있습니다. 이러한 변수는 모든 인스턴스에서 공유되므로 멀티스레드 환경에서의 동기화와 메모리 관리에 주의해야 합니다.