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(); 원래기능을 상실하여 재정의를 하는것
}
}