[Java] Java의 메모리

woo·2024년 8월 2일
0
post-thumbnail

위의 그림이 Java가 동작하는 과정이다. 하나하나 알아보자

1. Class Loader

자바에서 Main.java 코드를 작성한 후 컴파일하면 컴파일러가 .class 라는 클래스 파일을 생성한다. 이렇게 생성된 클래스 파일들을 JVM이 Class Loader를 이용해 메모리에 적재하게 된다.
위의 그림에서 Execution Engine은 .class 바이트 코드를 기계어로 변겨여해 실행하게 된다.

2. Jvm Memory

위의 그림에서 가운데 부분이 JVM이 할당받은 메모리 영역이다. 해당 영역은 5개로 구분되는데 우리에게 중요한 Class Area, Heap, Stack 영역에 대해서만 알아보기로 하겠다.

  1. Method Area
  • 메소드 영역은 클래스, 멤버 변수의 이름, 리턴 타입, 매개 변수 등의 클래스와 관련된 정보 그리고 Runtime Constant pool(상수, 참조 정보 저장), static 변수 등이 생성 되는 영역이다. static 변수의 경우 클래스 로딩 시, Method Area에 저장되기 때문에 인스턴스를 생성하지 않고도 사용할 수 있게 되는 것이다.
  1. Stack Area
  • Stack 영역의 경우 메서드가 호출되면 스택에 메서드를 위한 메모리가 할당 되며, 해당 메모리에서 메서드가 작업을 수행하는 동안 초기화하는 지역변수를 저장하는데 사용된다.
  • 메서드가 호출이 끝나면 할당되었던 메모리 공간은 반환되어 비워진다.
  • 이름처럼 호출된 메서드들이 Stack방식으로 쌓이기때문에 Stack의 가장 위에 있는 메소드가 현재 실행 중인 메서드가 된다.
  1. Heap Area
  • Heap영역의 경우 인스턴스가 생성되는 공간이다. 즉 new연산을 통해 프로그램 실행 도중 생성되는 모든 인스턴스는 이곳에 생성된다.
  • 참조 변수의 실제 데이터가 저장되는 공간이다. 스택에 생성된 참조 변수는 Heap Area의 실제 객체를 참조하게 된다.
  • Stack Area와 다르게 호출이 종료되어도 삭제되지 않는다. Garbage Collector에 의해 참조하지 않는 객체는 회수되게 된다.

즉 아래와 같은 코드가 있을 경우

class Student{
}

class Main{
	public static void main(String[] args){
    	Student student = new student;
    }
}


그림과 같은 구조를 가지게 되는 것이다.

0개의 댓글