Java

자바 메모리 구조

chandlerxx 2023. 12. 2. 22:08

들어가기에 앞서..

 

 

1. 왜 메모리(구조)를 배워야 할까요 (자바말고도)


개발자는 어떤 상황에서든 문제를 해결할 수 있어야 합니다.

예를 들어 주력 서비스를 개발해서 런칭해 웹사이트 오픈을 했어요. 근데 회사 서버컴퓨터 성능이 뒷받침 해주질 않아서 실제로 서비스를 이용하는 고객들이 불편함을 느낀다면? 고객 이탈이 발생할 겁니다.

결국 서비스 최적화를 위해 SW 로직 구현 뿐만 아니라 컴퓨터 HW(CS)의 전반적인 구조를 알고 있어야 해요.

 

그리고 무엇보다도 대부분의 회사 경영진이 좋아할 겁니다^^;; 저비용 고효율..모든 비즈니스 씬에서 먹히는 논리죠.

암튼. CPU, 메모리는 용량/성능/비용문제로 연결돼요.(클라우드 환경도 다르지 않다고 봐요)

 

그러니 기본 지식 정도는 알고 있어야 해요.

 

 

2.  자바 메모리 구조 (메서드/힙/스택)


그런 의미에서 자바 메모리 구조를 한번 살펴보겠습니다.

총 5가지 유형의 메모리 공간으로 나뉘지만 우선 3가지에 집중해보도록 하겠습니다.

 

출처 : geeksforgeeks.org

 

 

3-1. 메서드(Method) 영역


JVM이 실행될때 생성되며 프로그램이 종료될때까지 저장된다. 

바이트 코드(.class or 클래스의 실행코드)를 처음 메모리 공간에 올릴 때 초기화되는 대상을 저장하기 위한 메모리 공간이며 모든 쓰레드가 공유하는 영역이다.

 

[내부 구성]

  • 클래스 정보 (필드/메서드 데이터, 생성자 코드 등)
  • static 영역 (staic 변수들을 보관)
  • 런타임 상수 풀 (참조되는 클래스 이름, 문자열 및 숫자 상수의 초기 값 등)

런타임 상수풀 내 저장되는 데이터값을 확인하기 위해 오라클 블로그 에 제시된 클래스를 컴파일해보겠습니다. 

public class ConstantPoolCheck {

    public static void main(String[] args) {
        for( int i = 0; i < 10; i++ )
            System.out.println( "Hello from Hello.main!" );
    }
}

 

 

결과

-  공통의 리터럴 상수나 문자열 또는 필드, 클래스, 메서드 레퍼런스 정보들이 저장됨을 알 수 있다.

 

3-2. 스택(Stack) 영역


메서드 호출 시 하나의 스택영역이 생성되며 메서드 호출 정보를 포함하여 메서드 내부의 지역변수 등을 포함합니다.아래 그림과 같이 각 Thread마다 하나의 stack 영역을 할당 받습니다.

 

출처 : stackoverflow.com

 

[내부 구성]

  • 힙(Heap) 영역에 생성되는 객체의 참조값
    ㄴ 아래 힙 영역의 그림 참고하시면 이해되실 거예요.

 

 

3-3. 힙(Heap) 영역


객체(인스턴스)나 배열이 저장되는 공간입니다. 아래 그림을 보면 실제 객체나 배열은 Heap 영역에 생성해놓고, stack영역에서는 참조값만 저장하는 것을 확인할 수 있습니다.

앞으로 프로그래밍을 하면서 자주 접하게 될 내용이 Heap영역입니다. "변수를 선언했다, 객체를 생성했다, 배열을 만들었다" 등 실제 데이터는 Heap영역에 저장될 테니까요.

출처 :&nbsp;javarevisited.blogspot.com

 

 

 

[내부 구성]

  • 객체(인스턴스)
  • 배열

 

※ 더이상 참조되지 않는 객체 혹은 배열 데이터는 GC(가비지 컬렉션)에 의해 삭제된다

 

 


[출처]