본문 바로가기

 

서론

싱글톤 패턴, 정적 팩토리 메서드 패턴등의 디자인 패턴에서 사용하는 static variable을 알아보자.

 

 

static(정적), 뭐가 정적이라는걸까?

 

 

  자바에서는 static 키워드를 사용해서 변수나 메서드를 선언할 수 있다. static을 붙인 변수와 붙이지 않은 변수의 차이점은 뭘까? static 이라는 영어단어를 한글로 해석하면 정적으로 해석할 수 있다. 정적이라는게 동적이지 않다는것인데, 뭐가 정적이라는걸까?

 

 

  기능을 통해서 유추해보자. 아래와 같이 Test라는 클래스를 만들고 main 메서드를 static으로 선언하였다. JVM에서는 static main메서드를 보고 코드를 실행하게 된다.

 

class Test {
    public static void main(String [] args) {
        System.out.println("정적 메서드 테스트 입니다.");
    }
}

 

 

  클래스를 생성하였으면 인스턴스로 만들고 이 인스턴스를 통해서 메서드나 변수에 접근할 수 있음을 이미 알고있을 것이다. 하지만, static으로 선언한 변수나 메서드는 인스턴스로 만들지 않고도 바로 접근이 가능하다.

 

 

  이제 정적이라는게 뭐가 정적인지 짐작이 간다. 클래스를 생성하고 이를 인스턴스로 생성하면 동적으로 힙 영역에 적재되고 내려가고를 반복하게 된다. 즉, 인스턴스를 생성하는것은 동적이다.

 

  반면, static이 붙은 변수와 메서드는 인스턴스로 만들지 않아도 바로 접근이 가능하다. 프로그램이 실행되고 딱 한번 메모리에 적재되고 동적으로 메모리에서 상태가 변하지 않게된다.

 

 

static 변수가 저장되는 영역

 

 

Java8 이전

 

static 키워드가 붙은 자료형은 Heap의 Permanent 영역에 저장된다.

 

 

Java8 이후

 

  • Java8 이전의 PermGen 영역에는 Class/Method의 Meta정보, Static Object, 상수화된 String Object, Class와 관련된 배열 객체 Meta 정보, JVM 내부적인 객체들과 최적화컴파일러(JIT)의 최적화 정보 등이 저장
  • `Static Object`를 저장하는 경우 객체의 모든 부분이 PermGen에 저장되기 때문에  OOM이 발생하는 경우가 많았다.
  • Java 8에서 `Metaspace`가 도입되면서 Static Object 및 상수화된 String Object를 heap 영역으로 옮김으로써, 최대한 `GC`가 될 수 있도록 하였다.

 

 

 

정리

  • static이 붙은 변수나 메서드는 모든 인스턴스가 공유한다.
  • 프로그램 실행시 딱 한번 메모리에 올라간다.
  • 클래스 이름으로 직접 참조한다.
  • 이런 특징을 가지고 있어서, 정적 팩토리 메서드 패턴과 싱글톤 디자인 패턴 구현에 사용한다.
  • java 8 이전에는 permang generation area영역에 저장
  • java 8 이후에는 Metaspace에 저장해서 최대한 GC 당하도록 최적화 시킴

 

참조

 

 

Where java static variables are stored in memory?

class A{ static int i = 10; static int j = 20; static void getname(){ } } Where will these variable be stored in memory ?

stackoverflow.com

 

 

Java Memory 간단히 살펴보기 - J's log

Java 애플리케이션을 실행하는 경우, JVM 메모리에는 여러가지 데이터가 로드되고 해제된다. JVM 의 메모리는 어떤객체를 저장하고 어떤 용도로 사용되는지에 따라 여러 영역으로 나뉘어져 있다. JVM 메모리는 저장하는 데이터 및 용도에 따라 여러 영역으로 나뉘어져있다. Java 8 을 기준으로 JVM 메모리 영역에 변화(Metaspace 등장)가 있었으며, 각 메모리 영역별 특정에 대해 알아보자. JVM Memory 영역은 Runtime Data Are

mirinae312.github.io

 

댓글