Java #3

황현근·2023년 4월 27일
0

Acorn-Academy

목록 보기
13/28
post-thumbnail

자바 메모리 영역

프로그램이 실행되면 JVM은 OS로부터 메모리를 할당받고,
그 메모리를 목적에 따라서 여러 영역으로 나누어 관리한다.


Static 영역

📢 Method Area, Class Area, Code Area라고도 불린다.

  • Java 파일은 크게 필드(field), 생성자(constructor), 메서드(method)로 구성되어 있다.
  • Static 영역은 그 중 필드 부분에서 선언된 전역변수정적 멤버 변수(static 으로 선언되는 것)들의 데이터를 메모리에 상주시킨다.
    • 정적 멤버 변수 = Static 변수와 Static 메서드가 합쳐진 것 (=클래스 멤버)
    • 객체에 소속된 멤버가 아닌 클래스에 고정된 멤버다.
    • 클래스 정보(멤버변수의 이름), static변수, 변수 정보(데이터타입, 접근제어자정보), 메서드 정보 등을 저장한다.
    • static (전역)변수는 어디서든 접근이 가능하기 때문에 가능한 무분별한 사용을 하지 않는 것이 좋다.
    • JVM이 동작해서 클래스가 로딩될 때 생성된다.
    • 프로그램이 종료될 때까지 메모리에 남아있다.

Stack 영역

  • 스택 영역은 기본 자료형을 생성할 때 저장하는 공간으로, 임시적으로 사용되는 변수나 정보들이 저장되는 영역이다.
  • 참조 자료형은 참조값만 저장한다. 이 참조값은 heap 영역에 존재하는 인스턴스(객체)를 가르킨다.
    • 메서드를 호출할 때마다 개별적으로 스택이 생성되며 종료시 영역에서 해제된다.
    • 컴파일 타임 시 할당 된다.

👉 기본 자료형의 지역변수 와, 매개변수의 데이터 값이 저장되며, 추가적으로 객체 생성 시 참조 주소값도 저장 !


Heap 영역

  • 참조형(Reference Type)의 데이터 타입을 갖는 객체, 배열 등은 Heap 영역에 저장된다.
  • new 키워드로 생성된 객체와 배열이 Heap 영역에 저장된다.
  • 인스턴스의 실제 데이터는 Heap 영역에 올라간다. 저장된 메모리 위치가 다르기 때문에 static 메서드에서 외부 인스턴스 멤버에 접근할 수 없다.
    • Heap은 참조형의 데이터 객체에 실제 데이터들이 담기는 공간 이고, 실제 데이터를 가지고 있는 Heap 영역의 참조값을 Stack 영역의 객체가 가지고 있는 것이다.
    • new를 통해 인스턴스 객체를 생성했을 때, heap 영역에는 생성된 객체가 올라가고, Stack 영역에는 해당 객체에 대한 주소 값(Reference)이 저장
    • 어떤 참조 변수도 Heap 영역에 있는 인스턴스를 참조하지 않게 된다면, GC(가비지 컬렉터)에 의해 메모리에서 사라지게 된다.
 public class Student {
    int age = 10;
    int name = "현근";
}

class Sample {
    public static void main(String[] args){
        Student std1 = new Studet();
        Student std2 = new Student();
    }
}


👉 stack영역에 저장된 참조변수가 heap영역의 데이터를 찾아서 사용한다.
new 키워드로 인스턴스가 생성되어질 때 메모리에서 가리키는 인스턴스는 서로 다름 !

0개의 댓글