가비지 컬렉션(Garbage Collection) 자바 플랫폼에서는 객체와 배열들은 모두 힙(heap)이라는 메모리 공간에 저장 됩니다. new 키워드를 사용할 때마다 힙의 메모리에 새로운 객체가 할당 되는 것입니다. C++과는 달리 자바에서는 사용한 메모리를 반환하는 방법은 없습니다. 내부적으로 가비지 컬렉터가 이러한 일을 전담하고 있죠,,, 가비지 컬렉터는 낮은 우선 순위를 가지는 Backgroud Process로 동작하면서 어떤 객체의 메모리를 반환해야 하는 것인지를 계속 검사 합니다. 만약 반환 대상이 되는 사용되지 않는 객체를 찾았다면 소멸자(종료자)를 수행 하는 것과 같이 필요한 몇가지 작업을 하고 마지막으로 객체를 파괴하고 이 객체의 매모리를 힙에 반환 합니다. 프로그래머가 무엇을 하던지 메모리가 반드시 반환된다고 보장 할 수는 없지만 보통은 대상 객체에 null을 대입하고 System.gc() 메소드를 호출하는 방법을 주로 이용 합니다. 물론 System.gc()를 호출 했다고 가비지 컬렉션이 된다는 보장은 없지만 JVM이 한가하다면 가비지 컬렉션이 일어나면서 객체들은 소멸되고 메모리는 반환될 것입니다. 이러한 방법으로 메모리를 관리하면 편리하지만 개발자가 메모리를 직접 관리하지 못하므로 불편한 경우가 생길 수 있습니다. 이러한 문제점을 보완하기 위해 1.2이상에서는 java.lang.ref 패키지를 제공해서 프로그래머가 가비지 컬렉터에 접근할 수 있는 방법을 제공하고 있습니다. 이 패키지는 SoftReference, WeakReference, PhantomReference라는 세개의 클래스로 이루어 졌으며 이 클래스의 인스턴스는 객체에 대한 참조값을 보관하고 있습니다. 가비지 컬렉터는 이 참조값을 특별하게 다루는데 보통 참조가 가리키는 객체는 참조가 사라지기 전까지는 가비지 컬렉션 대상이 아니지만 위 클래스의 인스턴스들이 보관하는 참조는 특정 조건을 만족하면 자동으로 가비지컬렉션의 대상이 됩니다. 예를 들어 SoftReference 인스턴스가 보관하는 참조가 가리키는 객체는 시스템의 메모리가 부족한 경우엔 자동으로 가비지 컬렉션 대상이 됩니다. 즉 OutofMemoryError가 발생하기 전에 이 객체들은 모두 시스템에 반환될 것입니다. 이 객체들은 휴지통의 파일처럼 시스템이 필요하면 지울 수 있지만 지우기 전에는 언제나 다시 꺼내 쓸 수 있습니다. public class CallGarbageColletor { public static void main(String[] args) { byte[] test = new byte[4096]; Runtime r = Runtime.getRuntime(); System.out.println("사용 메모리 : " + (r.totalMemory() - r.freeMemory())/1024 + "K"); //객체를 명시적으로 해제 test = null; //Garbage Colletor 호출 System.gc(); r = Runtime.getRuntime(); System.out.println("-----객체를 해제 후 -----"); System.out.println("사용 메모리 : " + (r.totalMemory() - r.freeMemory())/1024 + "K"); } } [결과] 사용 메모리 : 276K -----객체를 해제 후 ----- 사용 메모리 : 137K |
[개강확정강좌]오라클자바커뮤니티에서 운영하는 개발자 전문교육 ,개인80%환급(www.onjprogramming.co.kr)
[주간]
[11/4]Spring3.X, MyBatis, Hibernate실무과정
[11/6]SQL초보에서실전전문가까지
[평일야간]
[11/1]C#,ASP.NET마스터
[11/5]iPhone 하이브리드 앱 개발 실무과정
[11/7]JAVA&WEB프레임워크실무과정
[11/8]Spring3.X, MyBatis, Hibernate실무과정
[주말]
[11/2]C#,ASP.NET마스터
[11/2]Spring3.X, MyBatis, Hibernate실무과정
[11/2]JAVA&WEB프레임워크실무과정
[11/9]안드로이드개발자과정
댓글 없음:
댓글 쓰기