7월 19 -메모리 관리

Yullgiii·2024년 7월 19일
0

자바의 메모리 관리와 가비지 컬렉션

자바의 메모리 구조

자바 메모리는 크게 네 가지 영역으로 나눌 수 있다:

  1. 메소드 영역 (Method Area): 클래스, 메소드, 필드, 정적 변수 등의 정보가 저장된다.
  2. 힙 영역 (Heap Area): 동적으로 생성된 객체와 배열이 저장된다. 가장 큰 영역으로, 가비지 컬렉션의 주요 대상이다.
  3. 스택 영역 (Stack Area): 각 스레드마다 생성되며, 메소드 호출 시 프레임이 생성되고, 지역 변수와 매개 변수가 저장된다.
  4. PC 레지스터 (Program Counter Register): 각 스레드마다 생성되며, 현재 실행 중인 명령의 주소를 저장한다.
  5. 네이티브 메소드 스택 (Native Method Stack): 자바 외의 네이티브 메소드가 실행될 때 사용된다.

가비지 컬렉션

가비지 컬렉션(Garbage Collection, GC)은 더 이상 사용되지 않는 객체를 메모리에서 자동으로 해제하는 기능이다. 자바에서는 java.lang.System.gc() 메소드를 통해 가비지 컬렉션을 명시적으로 호출할 수 있지만, JVM이 적절한 시점에 가비지 컬렉션을 수행한다.

주요 가비지 컬렉터

  1. Serial GC: 단일 스레드로 동작하며, 작은 애플리케이션에 적합하다.
  2. Parallel GC: 멀티 스레드로 동작하여, 성능을 높인다.
  3. CMS (Concurrent Mark-Sweep) GC: 멀티 스레드로 동작하며, 낮은 지연 시간을 목표로 한다.
  4. G1 (Garbage First) GC: 큰 힙 메모리와 멀티 프로세서 환경에 최적화된 가비지 컬렉터로, 자바 9부터 기본 가비지 컬렉터로 사용된다.

예제 코드

가비지 컬렉션을 관찰하기 위한 간단한 예제 코드를 작성해보자.

public class GarbageCollectionDemo {
    public static void main(String[] args) {
        // 객체 생성
        for (int i = 0; i < 100000; i++) {
            MyObject obj = new MyObject(i);
        }

        // 가비지 컬렉션 요청
        System.gc();

        System.out.println("Garbage Collection requested");
    }
}

class MyObject {
    private int id;

    MyObject(int id) {
        this.id = id;
    }

    @Override
    protected void finalize() throws Throwable {
        System.out.println("Finalize method called for object: " + id);
    }
}

이 예제에서 MyObject 클래스는 finalize 메소드를 오버라이드하여 객체가 가비지 컬렉션될 때 호출된다. System.gc() 메소드를 통해 가비지 컬렉션을 요청하고, 어떤 객체가 수거되는지 관찰할 수 있다

So...

자바의 메모리 관리와 가비지 컬렉션은 메모리 누수를 방지하고 애플리케이션의 성능을 유지하는 데 중요한 역할을 한다. 자바 메모리 구조와 주요 가비지 컬렉터에 대해 이해하고, 가비지 컬렉션이 어떻게 동작하는지 아는 것이 중요하다. 가비지 컬렉션을 명시적으로 호출하는 것은 피하는 것이 좋으며, JVM이 효율적으로 메모리를 관리할 수 있도록 설계하는 것이 중요하다.

이번 TIL에서는 자바의 메모리 구조와 가비지 컬렉션의 기본 개념, 주요 가비지 컬렉터, 그리고 가비지 컬렉션을 관찰할 수 있는 간단한 예제 코드를 살펴보았다. 이러한 지식을 바탕으로 메모리 관리에 대한 이해를 높이고, 더 나은 자바 애플리케이션을 개발할 수 있을 것이다.

profile
개발이란 무엇인가..를 공부하는 거북이의 성장일기 🐢

0개의 댓글