티스토리 뷰

기술이야기

Memory Leak 개요

novathinker 2009.10.28 17:38

Java Garbage Collection이라는 자동 메모리 관리 기능을 가지고 있습니다.

이것은 메모리 관리의 부담을 덜어 생산성을 향상하려는 좋은 기능입니다.

하지만 모든 자동 기능이 그러하듯 이것도 완벽하게 동작하지는 않습니다.

그래서 Java에서는 메모리 문제가 더 부각되는 경향이 있습니다.

 

우선 Memory Leak이란 무엇일까요?

Memory Leak을 말 그대로 풀자면 메모리 누수, 즉 메모리가 샌다는 것을 의미합니다.

일상생활에서도 샌다는 표현을 사용하죠.

써야 할 곳에 쓰지 않고 이상한데다 돈을 쓰면 어디선가 돈이 줄줄 샌다던가 하는 식으로요.

메모리도 마찬가지입니다. 불필요하게 메모리가 사용되면 메모리가 샌다고 표현하는 것이죠.



 

이 버섯똘이 같은 그림을 보시죠.

이 검은 점들이 바로 Object이고 이 Object들은 각각 원에 있는 것처럼 구분이 됩니다.

이 구분은 Root Set, Live, Reachable의 여부로 가능한 것입니다.

이것은 Java의 메모리 상에서 Garbage Object를 구분하는 방법이기도 합니다.

 Live Object는 이렇게 Root Set과 직, 간접적으로 연결이 되어 있는 것을 의미합니다. Live Object들은 Garbage가 아니기 때문에 Garbage Collection의 대상에서 제외됩니다.

반대로 Root Set과 관계가 끊어진 Object, Not Live Object Garbage Object가 되어 Garbage Collection의 대상이 됩니다.

이것은 Reference를 바탕으로 구별하고 있기 때문에 구분이 상당히 명확합니다.

그러나 Reachable Object JVM입장에서 보면 약간 모호한 구석이 있습니다.

Reachable Object Live Object중 사용자가 의도에 맞게 사용하고 있는 것이기 때문입니다.

Unreachable Object는 참조관계는 형성되어 있지만 사용되지는 않는 것을 말합니다.

그러니까 이것은 나중에 참조관계를 해체하여 Garbage로 만들어 주어야 하는 것입니다.

그러나 이 참조관계를 실수로라도 유지하고 있다면 이것은 그냥 메모리만 잡아먹고 있는 것입니다.

그렇기 때문에 이 Live But Unreachable Object Memory Leak의 주범이 됩니다.

저작자 표시 비영리 변경 금지
신고

'기술이야기' 카테고리의 다른 글

Root Set과 Memory Leak  (0) 2009.10.28
Memory Leak 개요  (0) 2009.10.28
Runtime Data Areas - Heap과 Object Layout  (0) 2009.10.28
Runtime Data Areas - Native Method Stacks  (1) 2009.10.28
댓글
댓글쓰기 폼