JAVA(Sol)(정리대기중..언젠가)

210421_3(garbageCollecting)

너굴셉 2021. 4. 21. 12:21

garbage collecting

의미 : 참조되지 않는 heap 영역의 메모리를 한가할때 JVM이자동으로 수거하는 기능

 

자동으로 수거하도록 두는것이 가장 좋은 방법이다.

 

------code

class 코드영역

-------data

static 상수영역 정적영역

--------------------------------method area

-------heap

객체영역 gc대상영역:가끔수거

-------stack

메서드실행영역 자동수거

(블럭이 끝나거나, return을 만나면), 바로수거됨

 

강제 수거 명령

  수거하다

System.gc();---> finalize() 자동 호출됨

finalize() : callback method(가상머신이 호출하는메서드)

-------------------------------------------------------------심화

finalize 메서드는 Object 클래스에서 제공하는 기본 메서드이다. 그래서 어느 클래스에서든지 finalize 메서드를 오버라이드 할 수 있다. 가비지 컬렉터에 의해 객체가 회수 될때, finalize 메서드가 호출된다.

문제점은 즉시 호출된다는 보장을 받을 수 없다.

 

결론: 자동으로 수거하도로 냅두는 것이 가장 좋은 방법이다.

 

package chapter12;

public class GarbageTest {

	public static void main(String[] args) {
		Garbage[] ga = new Garbage[10]; // 객체 배열변수 //선언할떄 new한번

		for (int i = 0; i < ga.length; i++) {
			ga[i] = new Garbage(i); // 객체의 생성 0~9 // 생성할때 new한번
		}

		for (int i = 0; i < ga.length; i++) {
			ga[i] = null; // 메모리 참조 삭제

		}
		System.gc();  //garbage collect 지금수거할래? super.finalize자동생성
	}

}

class Garbage {
	int objNo;

	public Garbage(int n) {
		objNo = n;
		System.out.println("Garbage class" + objNo + "이만들어졌습니다.");
	}

	protected void finalize() throws Throwable {
		System.out.println("Garbage class" + objNo + "에서 쓰이던 메모리가 수집되었습니다");
		super.finalize(); // 콜백메소드 	System.gc(); 원래기능을 상실하여 재정의를 하는것
	}
}