자바 정복 일기 - 자바 메모리 관리

Bex·2023년 8월 18일
0

자바 정복 일기 By Bex

목록 보기
11/12

1. 자바 메모리 관리

이번에 정리할 내용은 자바에서 메모리를 어떻게 관리하는지에 대해서이다. 그 전에 첫번째 정리에서 JVM에 대해서 공부하면서 메모리 영역에 대해 간단하게 알아보았다. 따라서 아래 링크를 통해 한 번 복습하고 나서 읽어보면 더 좋을 거 같다.

자바 정복 일기 - JVM, JRE, JDK


0) 들어가기 전

먼저 의문이 든 점을 해소하고 가보고자 한다. 우리는 단순히 코드 작성해서 원하는 결과값만 얻으면 장땡이지 않나 생각할 수 있다. 따라서 왜 프로그램의 메모리를 고려해야하는지에 대해 알아보자.

Q : 프로그램의 메모리를 왜 고려해야 할까?

  • 사실 답은 매우 간단하다. 바로 메모리 설계가 잘되어 있는 프로그램에 비해 메모리 고려가 되지 않은 프로그램은 속도 저하 현상 또는 튕김 등의 현상이 일어날 확률이 크기 때문이다!!!
  • 따라서 우리는 메모리 구조를 파악하고 한정된 메모리를 효율적으로 사용할 수 있어야한다.

1) 자바 실행 과정

이 부분 역시 JVM에 대해 공부하면서 알아봤지만 한번 더 알아보자.





















위의 그림을 통해 자바 실행 과정과 JVM의 구성을 알 수 있다.
  1. 소스 코드(.java), 즉 우리가 작성한 파일을 Java Compiler를 통해 바이트 코드(.Class) 파일로 변환
  2. 바이트 코드 파일을 JVM의 Class Loader로 보냄
  3. Class Loader에서 바이트 코드 파일을 JVM내로 로드하고 배치시킨다.
  4. Execution EngineClass Loader에 저장된 바이트 코드를 명령어 단위로 분류하여 하나씩 실행함
  5. Garbage Collector는 어플리케이션이 생성한 객체(인스턴스)의 생존여부를 판단해서 더이상 참조되지 않거나 null인 객체의 메모리를 해체시킨다.
  6. Runtime Data Area는 JVM이 실행되면서 할당받은 메모리 공간이다.

2) 자바 메모리 관리

자바의 메모리 구조는 아래 그림과 같다.

















자바의 메모리는 크게 stack과 heap 두 파트로 나누어진다

(1) Stack

  • 스택 프레임(혹은 Activation Record)을 저장하는 메모리 공간이다.

  • 스택 프레임은 메서드가 호출되기 이전의 상태를 기록하는 역할을 수행하며 다음과 같은 내용을 포함한다.

    1. 매개 변수(Parameter) : 호출 메서드가 전달한 인자 값

    2. 지역 변수(Local Variables) : 메서드 내에서 선언한 변수

    3. 리턴 주소(Return Address) : 메서드 실행을 마친 다음 실행할 명령문의 주소

    4. 리턴 값(Return Value) : 호출 메서드에게 돌려줄 값

  • 스택 프레임은 메서드가 호출될 때 메모리에 할당되고, 종료되면 메모리에서 제거된다.

결과적으로 기본 자료형에 해당되는 지역변수매개변수의 데이터 값이 Stack Area에 저장된다.

(2) Heap

  • Heap 메모리 영역에는 실제 객체가 저장된다.
  • Heap 영역에 존재하는 객체들은 Stack 영역의 변수들에 의해 참조된다.
  • new 키워드를 통해 생성된 객체, Array와 같은 동적으로 생성된 데이터가 저장된다.
  • Garbage Collector가 처리하지 않는한 소멸되지 않는다.

Stack과 Heap 정리


그렇다면 Heap 메모리에 저장된 데이터들은 어떻게 소멸되는 지 알아보자.

(3) Garbage Collection

  • Garbage Collection는 프로그래머가 힙을 사용할 수 있는 자유롭게 사용하고, 더 이상 사용되지 않는 오브젝트들은 가비지 컬렉션을 담당하는 프로세스가 자동으로 메모리에서 제거하도록 한다.

<가비지 컬렉션(GC) 특징>

  1. GC 프로세스는 JAVA에 의해 자동적으로 실행되며, 언제 GC가 작동할지는 JAVA가 결정됨
    (쉽게 말해서 우리는 언제 GC가 작동할 지 알 수 없음)
  2. GC는 사실 비용이 많이 드는 과정이고 GC가 실행된다면 현재 실행중인 애플리케이션의 모든 스레드가 일시중지됨
  3. GC 프로세스는 가비지 수집과 메모리 해제보다 훨씬 더 복잡한 프로세스이다.

<가비지 컬렉션 규칙>

  • Heap 영역에서 stack에서 도달 불가능한(Unreachable) 오브젝트들은 가비지 컬렉션의 대상이다.


참고자료

자바 메모리 관리 - 가비지 컬렉션
[Java] 자바 JVM 메모리 관리 파헤치기 (스택, 힙, Reference Type, 가비지 컬렉터)

profile
초보 개발자의 코딩 일기

0개의 댓글