Study...★/Java2011. 7. 4. 00:01

IBM JVM환경에서 발생할 수 있는 Memory Leak에 대한 일반적인 유형에 대해
알아보자.

먼저 GC의 알고리즘을 다시한번 상기시켜 보자.
GC가 Trigging되면, Garbage Collector는 Heap공간 전체를 scan하여
현재 '사용중'이거나 '살아있는'객체들을 표시(mark)한다.
이들을 reachable objects라고 표현하며, 반대로 사용이 끝났거나 reference가
끊긴 객체들을 unreachable objects라고 표현한다.
물론 이들은 GC에 의해 수거될 대상이다.

여기서 reachable objects중, 아래의 경우를 생각해 보자.
A라는 객체가 B라는 객체를 호출하거나 생성하여 reference를 만들었다.
이후, A객체는 아무일을 하지 않더라도 'unreachable objects'가 아닌 'reachable objects'로
분류된다는 점이다.
이러한 관점으로 아래의 일반적인 Memory Leak요소가 될수 있는 사항에 대해
살펴보자.

Hash table
Hash table에 담긴(hashed) 객체들은, 명시적으로 제거되지 않는 한 GC의 대상이 되지 않는다.
hashed object들은 항상 'reachable objects'로 분류되기 때문이다.

Static class
static class data는 일반 객체들과 독립적으로 존재한다.

JNI references
JNI reference는 사용 후, 반드시 명시적으로 제거해야 한다.

Objects with finalizers
finalize 메서드를 가지고 있는 객체들은, Finalizer thread가 기동될때만 GC된다.
하지만, Finalizer thread는 언제 실행될지도 모르며, 또한 한번도 실행되지 않을 수도
있는 특징이 있다. 따라서 특별한 경우가 아니면 Object클래스가 가지는 finalize 메서드를
재정의 하여 사용하지 말도록 한다.



원문 : http://javagosu.tistory.com/5
Posted by 달콤한녀석

댓글을 달아 주세요