Archives
Recent Posts
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Today
Total
관리 메뉴

안드로이드 개발자의 창고

[4일차 Java] 객체 생성 및 소멸/가비지 컬렉션(Garbage Collection) 본문

Computer/Java

[4일차 Java] 객체 생성 및 소멸/가비지 컬렉션(Garbage Collection)

Wise-99 2023. 5. 5. 20:09

 

 

출처 : 안드로이드 앱스쿨 2기 윤재성 강사님 수업 PPT

 

 

 

객체 생성

  • 객체를 만들면 메모리에 저장된다.
  • JVM은 객체의 고유 ID 값을 부여한다.
  • 변수에 객체를 넣으면 주소 값이 아닌 객체의 ID(숫자로 이루어짐) 값이 저장된다.
  • ID를 가지고 객체에 접근하여 객체가 가지고 있는 요소를 사용하게 된다.
  • 메모리 조각 모음(가비지 컬렉션)을 하더라도 ID는 변하지 않기 때문에 영향을 주지 않는다.
 

Java에서의 객체 소멸 시점

  • 객체를 접근하기 위해 사용하는, 객체의 ID 값을 가지고 있는 변수가 하나도 없다면 소멸의 대상이 된다.
  • 메모리 청소 작업(가비지 콜렉션)이 수행되면 소멸의 대상이 되는 객체는 모두 메모리에서 사라진다.
 

메모리 청소 시점

  • JVM이 메모리가 부족하다고 판단하는 경우
  • OS가 메모리가 부족하다고 판단하는 경우
  • 프로그램이 종료된(JVM이 종료된) 경우
  • 개발자가 코드를 통해 명시적으로 메모리 청소 명령을 날릴 경우

 


객체를 소멸 대상으로 만드는 방법

  • 객체를 생성할 때 객체의 ID를 변수에 담지 않는다.
  • 객체의 ID를 가지고 있는 변수에 Null 값을 넣어준다.

public class MainClass {

	public static void main(String[] args) {
		//객체를 생성한다.
		TestClass1 t1 = new TestClass1();
		System.out.printf("t1 : %s\n", t1);
		
		//객체의 ID를 가지고 있는 변수를 통해 메소드를 호출한다.
		t1.testMethod1();

        // 객체 참조 변수에 null을 넣어준다.
        t1 = null;

        // 객체의 ID를 가지고 있던 변수에 null을 덮어 씌운 다음 메서드를 호출한다.
        t1.testMethod1(); <<< 오류 발생 지점
    }
}

class TestClass1 {
	public void testMethod1() {
		System.out.println("testMethod1이 호출되었습니다");
	}
}

가비지 콜렉션(Garbage Collection)

  • 쓰레기를 모아 버린다는 의미를 가지고 있다.
  • 프로그래밍 언어에서 더이상 사용하지 않지만 메모리를 차지하고 있는 것들을 모아 제거하는 방법을 의미한다.
  • 가비지 콜렉터(Garbage collector) : 가비지 컬렉션을 해주는 소프트웨어
  • 가비지 콜렉션은 매우 부담되는 작업이기 때문에 너무 많이 실행하지 않는 것이 중요하다.
for(int i = 0 ; i < 100 ; i++) {
    System.out.println(i);
    // 가비지 콜렉터 가동
    System.gc();
}
 


알게된 점 & 깨달은 점

  • 객체는 JVM에 의해 메모리의 주소 값이 아닌 ID 값을 부여 받는다.
  • 때문에 가비지 콜렉션이 일어나도 영향을 받지 않는다.
  • 가비지 콜렉터 가동 명령 -> System.gc();