1. Local Variable
    1. 로컬 변수는 “스택 메모리” 영역에 저장합니다.
    2. 로컬 변수의 값은 각각 스레드의 “스택 프레임”에 할당됩니다.
    3. 메소드등이 실행을 하고 나면 로컬 변수의 메모리가 해제됩니다.
  2. Static Variable
    1. 정적 변수는 클래스 수준에서 선언 되는 변수입니다.
    2. 메소드 영역에 저장됩니다. 클래스 로딩 시에 메모리에 할당되며, 프로그램이 종료될 때까지 유지됩니다.
  3. Constant(static final).
    1. 변하지 않는 값을 의미하며, 컴파일 시에 값이결정됩니다.
    2. 메소드 영역의 “Runtime Constant Pool“이라는 영역에 저장됩니다.
  4. String Literal
    1. “Heap Memory” 영역에 저장됩니다.
      1. new 예약어를 쓰면 Heap 메모리에 할당 됩니다.
      2. String str = “hello world”; 이렇게 쓰면 “String Constant Pool“ (Heap 메모리 내부에 존재) 에 저장됩니다.
    2. 자바에서는 문자열 리터럴이 동일한 경우 같은 문자열 인스턴스를 공유 합니다.
    3. 굳이 왜 두가지를 나눠서…?
    4. jdk 1.6 → 1.7로 업데이트 하면서 PermGen에서 힙영역으로 옮겼습니다.
    5. 이유는 Permgen의 고정 공간이 문제가 되었습니다. → OOM: PermGen
  5. Class의 메타데이터 (jdk 1.8 부터 permgen → metaspace로 변경 됬습니다.)

번외. Runtime Constant Pool 과 String Constant pool 사이

번외. Metaspace(JDK1.8부터 등장)