160 likes | 409 Views
SCJP. Garbage Collection. Garbage Collection. Garbage Collector( 이하 GC) 가 Heap 영역에 할당된 , 더 이상 사용되지 않는 메모리인 Garbage 를 다른 객체가 사용할 수 있도록 정리하는 것 . C++ 에서의 메모리 해제 int * v= new int ; delete v; int * ary = new int [10000]; delete [] ary ;. Garbage Collection 방법.
E N D
SCJP Garbage Collection
Garbage Collection • Garbage Collector(이하 GC) 가 Heap 영역에 할당된, 더 이상 사용되지 않는 메모리인 Garbage를 다른 객체가 사용할 수 있도록 정리하는 것. • C++ 에서의 메모리 해제 • int* v= new int; • delete v; • int* ary= new int[10000]; • delete [] ary;
Garbage Collection 방법 • 객체를 가리키는 참조 변수가 null로 지정되거나 객체를 더 이상 참조하지 않을 때gc의 후보가 된다. • gc의 후보가 된다고 해서 즉각적으로 gc가수행되는 것은 아니다. • 여유 메모리가 부족하거나 사용자의 입력을 기다리는 경우와 같이 프로그램이 활동하지 않을 경우 gc가 수행된다. • 왜? gc는 매우 복잡한 과정을 거쳐야 하므로 수시로 gc를 수행하면 프로그램 성능에 좋지 않다.
Garbage Collection 특징 • Automatic memory management 라고 부르기도 함. • gc는 프로그래머에 의해 구현될 수 없다. • gc대상은 Object이지 reference가 아니다. • 할당된 메모리를 명시적으로 해제할 수 없다. • gc의 내부는 완벽이 캡슐화 되어, 그 동작을 알 수 없다. • gc가 정확히 언제 수행되는지 알 수 없다. • 다른 참조 변수가 참조하고 있다면 gc의 대상이 아니다.
Garbage Collection 예제 • 1. gc대상이 되는 경우 String str= new String(“scjp”); str= null; • 참고. String str= new String(“aaa”); String str= “aaa”; 위 두 개의 수행은 같다.
Q1 • Java에서 유일한 unsigned data type는? • 그 값의 범위는?
Garbage Collection 예제 • 2. gc대상이 되는 경우 String str; str= new String(“scjp”); str= new String(“scjd”); • 같은 참조 변수 str에 두번의 메모리 할당이 수행되었다. 그렇다면 첫번째 할당된 메모리에 대한 gc가 수행된다.
Garbage Collection 예제 • 3. gc대상이 되는 경우 public void print(){ String str= new String(“aaa”); } • print() 함수에 진입한 후 리턴 될 때,str이 reference하는 문자열 “aaa”는 더 이상의 참조가 없으므로 gc의 대상이 된다.
Garbage Collection 예제 • 3. gc대상이 되지 않는 경우 public String print(){ String str= new String(“aaa”); return str; } public static void main(String args[]){ String myStr= print(); } • 앞의 경우와는 다르게 이 경우에는 gc의 대상이 되지 못한다. myStr이 reference하기 때문이다.
Garbage Collection 예제 • 3. gc의 대상이 아닌 경우 • String str1= new String(“aaa”); • String str2= str1; • str1= null; • str1을 null로 할당 했다 하더라도,str2가 참조를 하고 있으므로 gc의 대상이 아니다.
Q2 class Test { public Test(){ this.a= 10; b= 20; this.c= 30; } private int a; private int b; private int c; } class MainClass{ public static void main(String args[]){ Test test= new Test(); System.out.println(test); } } 다음과 같은 출력을 할 수 있도록 위 프로그램을 수정하세요. //출력결과 a= 10; b= 20 c= 30
Q3 • byte, long, double, char, int, short, float다음을 묵시적 형 변환이 일어날 수 있는 순서로 나열 하라.Ex) short -> float -> …. -> ….
Q4 public static void main(String args[]){ intary[]= new int[10]; try{ System.out.println(ary[num]); }catch(Exception e){ System.out.println("exception"); }finally{ System.out.println("finally"); } } • num= -1 인 경우 출력 • num= 5 인 경우 출력 • num= 10 인 경우 출력
Garbage Collection class Test{ public Test(){ 파일 열기 작업을 한다. } } Test test= new Test(); 위의 프로그램은 제대로 작성되지 못한 프로그램이다. 만약 test에 null이 할달 되거나 new Test();가 더 이상 참조 되지 않는다면, 생성자에서 작업한 파일 열기 작업에 대한 파일 닫기 작업을 수행하지 않게 된다. class Test{ public Test(){ 파일 열기 작업을 한다. } public fileClose(){ 파일 닫기작업을 한다. } } Test test= new Test(); 와 같으 프로그래밍 하였더라도 test.fileClose() 함수를 호출 하지 않을 가능성이 있다.
Garbage Collection class Test{ public Test(){ 파일 열기 작업을 한다. } protected void finalize() throws Throwable{ 파일 닫기 작업을 한다. } } Test test= new Test(); Java.lang.Object의 finalize 메소드를overriding 하여, 객체가 소멸 될 때 반드시 수행해야 하는 루틴을 담아 놓는다. finalize() 메소드는gc에 의해 해당 객체가 소멸될 때 호출되는 함수이다. 앞서 설명한 바와 같이 finalize 함수의 호출 시키는 java VM이 결정한다.