Java

Java 메모리 영역(Static, Stack, Heap)

Yukart 2022. 1. 11. 14:47
반응형

 

❓Static

  • 패키지나 클래스 정보가 호출되는 시점에 올라간다.
  • static이 붙은 클래스 멤버(필드,메소드)도 이 영역에 올라간다.
  • static을 붙일 대상은 읽기 전용이 아닌 경우, 가능한 사용하지 않아야 하고 무분별하게 사용하면 멀티스레드에서의 Thread Safe 문제가 발생할 수 있다.
  • 클래스, 메소드 영역이라고 불린다.
  • JVM 종료 시점까지 사라지지 않고 유지된다.

 

❓Stack

  • 흔히 말하는 call stack이 이 영역에서 다뤄지는 내용이다.
  • stack에서 선언된 지역변수는 stack에 위치한다.
  • primitive는 stack 영역에 저장되고 reference(wrapper 등)는 참조값만 저장된다.
  • 외부의 stack frame에서는 내부 stack frame 변수 접근이 불가능하지만 내부에서 외부로는 가능하다.
  • 스레드도 stack 영역에 생성되며, 1개의 스레드는 별개의 T Memory(static, stack, heap)을 갖게 된다. 이로 인해서 하나의 스레드는 다른 스레드로 접근 불가능하지만, static과 heap은 공유해서 사용할 수 있다.
  • 위 특징으로 인해 멀티스레드 구조가 멀티 프로세스보다 메모리를 적게 사용한다.

 

❓Heap

  • 생성된 인스턴스들이 올라간다.
  • 인스턴스의 필드는 Heap에 올라가고, 이로 인해서 static 메소드에서 인스턴스 멤버를 접근할 수 없다. 대상이 어떤 것인지도 모르고, 존재하지 않을 수도 있기 때문에
  • 메소드들은 static이 아니어도 heap에 생기지 않는다.
  • stack 영역에서 참조값을 이용해 참조형 변수가 이 영역의 인스턴스를 제어할 수 있다.
  • 이 영역에 있는 인스턴스에 어떤 참조 변수도 참조하지 않으면 GC에 의해 제거된다.
  • 상속을 이용해 인스턴스를 생성하면, 상위 클래스들(Object까지)의 인스턴스도 같이 생성한다.

 

📒 참고 : 클래스의 필드 구분

class Car {

    static int modelOutput; // 클래스 변수

    String modelName;       // 인스턴스 변수

 

    void method() {

        int something = 10; // 지역 변수

    }

}

 

멀티스레드를 어떻게 사용할까?

  • 멀티스레드는 Stack 영역에 대해서 스레드의 수 만큼 분할해서 사용한다. 그렇기 때문에 다른 스레드의 Stack 영역은 접근하지 못하는 특성으로 Thread Safe 하다.

References

 

반응형

'Java' 카테고리의 다른 글

Java Thread 기초  (0) 2022.02.04
java 자주 발생하는 예외  (0) 2022.02.04
Java Servlet이란  (0) 2022.01.11
Servlet의 역사  (0) 2022.01.11
DBMS별 JDBC Driver  (0) 2022.01.11