개발은 재밌어야 한다
article thumbnail
반응형

 

static 변수인스턴스 변수 중 어떤 방식이 적합한지 선택하는 것은 메모리 최적화에 중요한 요소입니다. 이번 글에서는 힙 메모리 관리를 중심으로, static 변수를 사용하는 것이 언제 유리한지, 그리고 인스턴스 변수를 사용할 때의 장단점에 대해 알아보겠습니다.

 

static 필드와 메모리 관리

static 필드는 클래스 레벨에서 메모리에 올라가며, 객체의 인스턴스와 상관없이 전역적으로 접근 가능합니다. 이 필드들은 메소드 영역(Metaspace)에 저장됩니다. 메소드 영역은 클래스의 메타데이터, 정적 필드(static fields), 상수(Constant Pool) 등을 저장하는 공간으로, JVM이 클래스를 로드할 때 한 번 할당되며 프로그램이 종료될 때까지 메모리에 유지됩니다.

static 필드의 특징:

  • 저장 위치: 메소드 영역(Metaspace)
  • 생명 주기: 클래스가 로드될 때 생성, JVM 종료 시까지 유지
  • 공유: 애플리케이션 전역에서 값을 공유할 수 있음 (동일한 값을 여러 인스턴스가 참조)
  • GC에 의한 해제 불가: 프로그램이 종료될 때까지 메모리에 남아있음

장점:

  • 메모리 절약: 클래스당 하나의 static 필드만 생성되기 때문에, 동일한 값이 여러 인스턴스에서 사용될 때 메모리 사용이 효율적입니다. 인스턴스마다 같은 값을 저장하는 대신, static 필드를 사용해 전역적으로 공유하는 방식이 메모리 낭비를 줄여줍니다.

단점:

  • 메모리 상주: 프로그램이 종료될 때까지 메모리에 남아있기 때문에, 사용되지 않는 static 필드도 계속 메모리를 차지할 수 있습니다. 만약 불필요한 값을 static으로 선언하면 메모리 자원을 비효율적으로 사용할 수 있습니다.

인스턴스 필드의 메모리 관리 (Static을 사용하지 않을 때)

반대로, 인스턴스 필드는 해당 클래스의 객체가 생성될 때마다 힙(Heap) 메모리에 저장됩니다. 각 객체는 독립적인 메모리 공간을 할당받기 때문에, 인스턴스 필드들은 개별 객체마다 존재하게 됩니다. 이는 각 인스턴스마다 다른 값을 저장해야 하는 경우에 유리합니다.

인스턴스 필드의 특징:

  • 저장 위치: 힙(Heap) 메모리
  • 생명 주기: 객체가 생성될 때 할당, 객체가 더 이상 참조되지 않으면 GC(Garbage Collector)에 의해 해제됨
  • 독립성: 인스턴스마다 별개의 값으로 관리되며, 객체가 여러 개일 때 각기 다른 값을 가질 수 있음
  • GC 해제 가능: 필요하지 않게 되면 GC가 힙 메모리에서 해당 객체를 제거해 메모리를 회수함

장점:

  • 유연성: 객체마다 개별적으로 값을 설정할 수 있고, 특정 객체가 더 이상 필요하지 않을 때 GC에 의해 메모리가 해제되기 때문에, 메모리 관리가 상대적으로 유연합니다.
  • 객체의 독립성 보장: 객체별로 다른 값을 가져야 한다면, 인스턴스 필드를 사용하는 것이 적합합니다.
반응형

단점:

  • 메모리 사용량 증가: 만약 여러 인스턴스에서 동일한 값을 사용해야 한다면, 인스턴스 필드는 각 객체마다 동일한 값을 반복해서 저장해야 하므로 메모리 낭비가 발생할 수 있습니다.
  • GC 의존: 인스턴스 필드는 객체의 수명에 따라 메모리 해제가 이루어지기 때문에, 메모리 해제 시점이 명확하지 않거나, 대량의 인스턴스가 생성되면 오히려 힙 메모리가 부족해질 수 있습니다.

Static vs Non-static: 메모리 사용 측면에서의 비교

구분Static 필드인스턴스 필드 (Non-static)

저장 위치 메소드 영역(Metaspace) 힙(Heap) 메모리
메모리 사용량 클래스당 한 번만 메모리에 로드되므로 메모리 절약 가능 인스턴스마다 필드가 존재하므로 메모리 사용량이 증가
수명 JVM 종료 시까지 메모리에 상주 객체가 GC에 의해 제거되면 메모리 해제
메모리 효율성 값이 공유될 때 효율적 (값이 변하지 않는 경우 유리) 객체마다 다른 값이 필요할 때 유리
GC에 의한 해제 불가능 (프로그램 종료 시까지 메모리 상주) 가능 (객체가 더 이상 사용되지 않으면 해제 가능)

메모리 효율성을 고려한 static 사용 여부

  • static 필드를 사용하는 경우:
    • 애플리케이션에서 전역적으로 공유해야 하는 값일 때, static 필드를 사용하는 것이 메모리 효율을 높일 수 있습니다. 예를 들어, 애플리케이션 설정 값, 데이터베이스 접속 정보처럼 한 번 설정되면 프로그램 내내 동일한 값으로 유지되어야 하는 경우에 적합합니다.
    • 이 방식은 인스턴스 개수가 많아져도 메모리를 절약할 수 있다는 점에서 유리합니다. 클래스당 하나의 필드만 메모리에 존재하며, 모든 인스턴스가 이를 참조하기 때문입니다.
  • static 필드를 사용하지 않는 경우:
    • 객체별로 다른 값을 가져야 할 때는 인스턴스 필드가 더 적합합니다. 인스턴스 필드는 각 객체가 독립적인 값을 가질 수 있기 때문에, 각 인스턴스마다 다른 상태를 유지할 수 있습니다.
    • 또한 인스턴스가 더 이상 필요하지 않을 때는 GC가 메모리에서 자동으로 해제해주므로, 메모리 관리가 유연해질 수 있습니다.

결론: 힙 메모리 관점에서 static 사용 여부 결정하기

힙 메모리메소드 영역의 차이를 고려하면, 다음과 같이 결정할 수 있습니다.

  • 전역적으로 하나의 값만 필요하고, 여러 인스턴스에서 공유해야 하는 값은 static 필드로 선언하는 것이 적합합니다. 이 방식은 메모리 절약성능 최적화에 도움이 됩니다.
  • 반면, 객체마다 독립적인 값을 유지해야 하거나, 동적 메모리 관리가 필요한 경우에는 인스턴스 필드로 관리하는 것이 좋습니다. 필요하지 않은 인스턴스가 자동으로 해제되기 때문에 메모리 누수를 방지할 수 있습니다.
반응형
profile

개발은 재밌어야 한다

@ghyeong

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!