🌱Java | Spring

[Java] Java의 메모리 관리(2)

이줭 2022. 7. 31. 13:57
728x90

이전 Java Memory 영역에 대한 설명에 이어 참조 타입과 GC의 동작에 대해 알아보자! 🙋‍♂️

 

이전 포스팅 : https://dev-jy.tistory.com/56

 

[Java] Java의 메모리 관리(1)

Java의 Memory 영역 Java 프로그램이 실행되면 JVM(Java Virtual Machine)은 OS로부터 메모리를 할당받고, 그 메모리를 용도에 따라 여러 영역으로 나누어 관리한다. JVM의 메모리 공간(Runtime Data Area)은 크게 M

dev-jy.tistory.com

 

아래의 Memory 구조 그림을 자세히 보면, Heap에서 객체에 대한 참조를 나타내는 화살표가 다르게 생긴것을 알 수 있다.😶‍🌫️ Java에서는 Strong Reference, Weak Reference, Soft Reference, Phantom Reference와 같은 다양한 참조 유형이 있기 때문이다. 참조되는 Heap의 객체들은 Garbage Collecting의 기준에 따라 여러 참조 타입으로 분류된다.

 

Reference Type

 

Strong Reference

 

평소 가장 익숙한 참조 유형으로, 이전 포스팅에서 봤던 아래의 StringBuilder 예제에서 Heap 영역에 존재하는 객체에 대한 Strong Reference를 가지고 있다고 보면 된다. 그리고, Heap 영역에 존재하는 객체들 중 이런 Strong Reference로 연결되어 있는 경우 Garbage Collector에 의해 제거되지 않는다.

StringBuilder builder = new StringBuilder();

Weak Reference

 

Heap 영역에 존재하는 Weak Reference는 Garbage Collector가 수행되면 제거될 수 있다. 무조건 제거된다는 것은 아니고 참조되는 객체가 null이고, 해당 객체를 가리키는 참조가 Weak Reference인 경우 제거 될 수 있다.

 

아래와 같이 java.long 패키지의 WeakReference 클래스를 사용하면 약한 참조를 만들 수 있다.

Integer i = 1;
WeakReference<Integer> weak = new WeakReference<Integer>(i);

위의 예시에서 i == null일 경우 GC에 의해 제거된다.

 

Soft Reference

 

Soft Reference의 경우 응용 프로그램의 메모리가 부족한 경우에만 GC에 의해 제거되므로, 메모리에 무척 민감한 상황에서 사용된다. 따라서 일부 Memory 공간을 확보할 필요가 없는 한 GC는 Soft Reference 유형의 객체를 제거하지 않는다. Java는 모든 Soft Reference 유형의 객체가 OutOfMemoryError를 발생시키기 전에 제거되도록 보장한다.

 

Soft Reference는 아래와 같이 생성할 수 있다.

SoftReference<StringBuilder> sr = new SoftReference<>(new StringBuilder());

 

Phantom Reference

 

Phantom Reference는 객체가 더 이상 살아있지 않다는 것을 확실히 알고 있기 때문에 사후 정리 작업을 예약하는 데 사용된다. Phantom Reference의 get 메서드는 항상 null을 반환하기 때문에 참조 Queue에서만 사용된다. 

 

즉, 사용이 아닌 올바르게 삭제하고 삭제 이후의 작업을 조작하기 위해 사용 되는 것이다.

 

Java에서는 finalize()라는 메서드가 존재하고 이 메서드는 GC에 의해 호출되지만 이는 몇가지 문제점을 가지고 있다. finalize() 메서드를 잘못 사용하면 GC에 의해 제거된 객체가 resurrect (부활) 될 수도 있다. 그러나 Phantom Reference는 Memory에서 해제된 후 enqueue되기 때문에 객체가 resurrect되는 문제가 없다.

 

 

 

 

참고 : https://ttl-blog.tistory.com/368

https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EA%B7%B8%EB%A6%BC%EC%9C%BC%EB%A1%9C-%EB%B3%B4%EB%8A%94-%EC%9E%90%EB%B0%94-%EC%BD%94%EB%93%9C%EC%9D%98-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EC%98%81%EC%97%AD%EC%8A%A4%ED%83%9D-%ED%9E%99

 

728x90

'🌱Java | Spring' 카테고리의 다른 글

[Spring] DI와 IOC  (0) 2023.04.10
[Java] Throw vs Throws  (0) 2023.04.09
[Java] Java의 메모리 관리(1)  (0) 2022.07.24
[Spring] Filter vs Interceptor  (0) 2022.07.18
[Spring] Spring MVC  (0) 2022.06.30