J-S-09 자바 객체의 생존과 소멸 그리고 깊이 있는 메모리 레이아웃 분석

글 정보
카테고리
Programming/Java/Starter
태그
JavaLevel2

1. 도달 가능성 분석: GC는 삭제 대상을 어떻게 결정할까?

Java의 가비지 컬렉터(GC)는 단순히 메모리가 꽉 찼다고 해서 무작정 객체를 지우지 않습니다.

가장 먼저 이 객체가 살아있어야 할 이유(도달 가능성) 가 있는지 확인하는 과정을 거칩니다.


2. G1 GC와 현대적인 메모리 관리

Java 9부터 기본(Default) GC로 채택된 G1(Garbage First) GC는 대용량 힙 메모리를 효율적으로 관리하기 위해 등장했습니다. (참고: Java 8의 기본 GC는 Parallel GC입니다.)

    public class Main {
        public static void main(String[] args) {
            {
                byte[] placeholder = new byte[64 * 1024 * 1024]; // 64MB 할당
            }
            // int a = 0; // 이 줄을 추가하면 GC가 정상 작동함!
            System.gc();
        }
    }

3. 자바 객체 내부 들여다보기: JOL(Java Object Layout)

우리가 new Object()를 할 때, 메모리에는 데이터만 저장되는 것이 아닙니다. org.openjdk.jol 라이브러리로 확인해 보면 객체는 크게 세 부분으로 나뉩니다.

1) Header (객체 헤더)

2) Instance Data

3) Padding


4. 동등성(Equality) vs 동일성(Identity)

자바 초심자가 가장 많이 헷갈리는 "같다"의 두 가지 의미를 명확히 구분해야 합니다.

동일성 (Identity)

동등성 (Equality)

💡 핵심 요약 Object 클래스의 기본 equals()는 내부적으로 \=\=을 사용합니다.

따라서 객체의 내용을 비교하고 싶다면, 반드시 equals()hashCode()를 재정의(Override)해야 합니다.