Java Reference & GC

객체 참조는 Java 언어에서 매우 중요한 개념입니다. 객체 참조를 관리하는 방식에 따라서 메모리 사용량과 성능 등에 큰 영향을 미치기 때문입니다.

 

Java에서는 객체 참조를 Strong reference, Soft reference, Weak reference, Phantom reference 참조 타입으로 구분하여 제공합니다. 이 중에서 Strong reference는 가장 일반적인 참조 방식으로, 해당 객체를 참조하는 변수가 있으면 GC(Garbage Collector)가 메모리에서 제거하지 않습니다. 이에 반해, Soft reference, Weak reference, Phantom reference는 해당 객체가 메모리에서 제거될 가능성이 높은 상황에서 사용하는 참조 방식으로 구분됩니다.


Strong Reference & Strongly reachable

Java에서 Strong reference는 가장 일반적인 참조 방식입니다. 객체를 참조하는 변수가 있으면 해당 객체는 GC(Garbage Collector)가 메모리에서 제거하지 않습니다. 즉, Strong reference를 가진 객체는 Strongly reachable하다고 할 수 있습니다.

Strongly reachable 객체는 어떤 변수나 객체에서도 직접 또는 간접적으로 참조되는 객체들입니다. 이러한 객체는 GC가 메모리에서 제거되지 않습니다. 따라서 Strong reference가 있는 객체는 메모리에 계속 유지되는 것이 보장됩니다.

하지만 Strong reference는 메모리 누수 문제를 발생시킬 수 있습니다. Strong reference로 참조되는 객체는 참조하는 변수나 객체가 없어지기 전까지 계속해서 메모리에 유지됩니다. 이렇게 불필요하게 메모리를 유지하면서 GC가 수행되지 않으면 메모리 부족 상황이 발생할 수 있습니다.

따라서 Strong reference를 사용할 때에는 해당 객체가 계속해서 필요한 경우에만 사용하는 것이 좋습니다. 만약 객체가 더 이상 필요하지 않은 경우에는 해당 객체를 null로 설정하여 참조를 제거해야 합니다. 이렇게 하면 GC가 해당 객체를 메모리에서 제거할 수 있습니다. 또는 Soft reference, Weak reference, Phantom reference 등을 사용하여 GC가 불필요한 객체를 제거하도록 해야 합니다.

 

https://d2.naver.com/helloworld/329631


Weak reference & Weakly reachable

Java에서 Weakly reachable한 객체는 참조를 가지고 있지만, 해당 참조가 Strong reference가 아닌 Weak reference인 경우를 말합니다. Weak reference를 가진 객체는 GC가 수행될 때 메모리에서 자동으로 제거될 수 있습니다.

Weak reference는 Strong reference와는 달리 객체를 강하게 참조하지 않습니다. 즉, Weak reference를 가진 객체가 GC의 대상이 되면 해당 객체는 메모리에서 자동으로 제거됩니다. 이러한 Weak reference는 메모리 누수를 방지하는데에 매우 유용합니다.

만약 Weak reference를 사용하지 않은 Strong reference를 가진 객체가 더 이상 필요하지 않아지면 해당 객체를 참조하는 변수를 null로 설정하여 참조를 제거해야 합니다. 하지만 이렇게 참조를 제거해도 Weakly reachable 객체가 아닌 Strongly reachable 객체일 경우에는 GC가 객체를 제거하지 않습니다. 따라서 Weak reference를 사용하여 객체를 참조하는 것이 메모리 누수를 방지하는데에 더욱 효과적입니다.

Weak reference는 예를 들어 캐시(cache)에서 사용될 수 있습니다. 캐시에서는 일정 기간동안 사용하지 않은 객체를 제거해야 하기 때문에 Weak reference를 사용하여 GC가 해당 객체를 제거할 수 있도록 합니다. 또한 Weak reference는 메모리를 많이 차지하는 대규모 객체를 다룰 때 유용합니다. 이 경우, GC가 객체를 자동으로 제거하여 메모리 사용량을 최소화할 수 있습니다.


Soft reference & Softly reachable

Java에서 Soft reference는 Weak reference와 유사하지만 GC가 해당 객체를 제거하는 시점이 다릅니다. Soft reference를 가진 객체는 GC가 메모리 부족 상황에서만 제거할 수 있습니다.

Soft reference를 사용하면 메모리 부족 상황에서 GC가 Soft reference를 가진 객체를 우선적으로 제거하고 메모리를 확보할 수 있습니다. 이러한 기능은 대규모 객체를 다룰 때 매우 유용합니다. Soft reference를 사용하여 이전에 사용한 대규모 객체를 보존할 수 있으며, 다시 필요해질 때 다시 사용할 수 있습니다.

Softly reachable객체는 참조를 가지고 있지만 해당 참조가 Strong reference가 아닌 Soft reference인 경우를 말합니다. 즉, Soft reference를 가진 객체는 GC가 수행될 때 메모리에서 자동으로 제거될 가능성이 있는 객체입니다.

Soft reference는 캐시(cache)에서 사용될 수 있습니다. 캐시에서는 자주 사용하지만 언제든지 메모리에서 제거할 수 있는 객체를 보존해야 할 때 Soft reference를 사용하여 GC가 이러한 객체를 우선적으로 제거하도록 합니다. Softly reachable 객체는 메모리 부족 상황에서 GC가 우선적으로 제거할 수 있습니다. 이렇게 함으로써 캐시에서 불필요한 객체를 제거하면서도 메모리 사용량을 최소화할 수 있습니다.


Phantom reference & Phantomly reachable

Java에서 Phantom reference는 GC가 해당 객체를 수집하는 순간에 알려주는 역할을 합니다. Phantom reference는 객체가 GC에 의해 제거되었다는 사실을 알려주는 역할만 하며, 객체를 직접 참조하는 것은 불가능합니다.

Phantom reference를 사용하면 객체가 GC에 의해 수집되었는지 여부를 알 수 있기 때문에 객체가 수집된 후 추가적인 작업을 수행할 수 있습니다. 이러한 작업에는 객체의 종속성(dependency)을 제거하거나 객체가 사용한 리소스를 해제하는 등의 작업이 포함될 수 있습니다.

Phantomly reachable 객체는 참조를 가지고 있지만 해당 참조가 Strong reference나 Soft reference가 아닌 Phantom reference인 경우를 말합니다. 즉, Phantom reference를 가진 객체는 GC가 수행될 때 메모리에서 자동으로 제거될 가능성이 있는 객체입니다.

Phantom reference와 Phantomly reachable 객체는 대개 네이티브 메모리 객체와 관련이 있습니다. 네이티브 객체는 Java에서 직접 메모리를 할당하고 사용하는 객체가 아니므로 GC의 제어권 밖에 있습니다. 이러한 경우에는 Phantom reference를 사용하여 해당 객체가 GC에 의해 수집되었는지 여부를 알 수 있고, 이에 따라 네이티브 메모리를 안전하게 해제할 수 있습니다.


Summury

  • Strong reference
    • Strong reference는 객체를 직접 참조하며, 해당 객체를 참조하고 있는 동안에는 GC의 수집 대상에서 제외됩니다.
  • Weak reference
    • Weak reference는 객체를 참조하는 다른 객체가 없는 경우에만 GC의 수집 대상이 됩니다. 즉, 해당 객체를 참조하는 다른 객체가 모두 GC의 수집 대상이라면, 해당 객체도 GC의 수집 대상이 됩니다.
  • Soft reference 
    • Soft reference는 메모리가 부족할 때에만 GC의 수집 대상이 됩니다. 메모리가 충분하다면 GC의 수집 대상에서 제외됩니다.
  • Phantom reference 
    • Phantom reference는 객체가 GC에 의해 수집되었을 때만 알림을 받을 수 있으며, 실제로 객체를 참조하는 것은 불가능합니다. Phantom reference를 가지고 있는 객체는 GC의 수집 대상이 됩니다.

 

각각의 Reference를 다 참조 받고 있는 객체가 있다고 하면은 reference의 우선순위는 다음과 같습니다. 

  • Strong -> Soft -> Weak -> Phantom

https://d2.naver.com/helloworld/329631

 

'Zero-Base > Java' 카테고리의 다른 글

Stream(스트림)  (0) 2023.03.07
람다 표현식 (Lambda Expression)  (0) 2023.03.07
컬렉션 프레임워크(Collection Framewordk)  (0) 2023.03.07
예외처리  (0) 2023.03.07
입출력  (0) 2023.03.07