해당 포스트작성 목적
LRU캐시란 무엇일까?? 저번 Weak/Soft Reference를 공부하며, WeakReference가 LRU캐시를 구현하기 적합하다는 것을 보았다. LRU캐시는 무엇일까?? 또 어떤점에 Weak Reference가 적합하다는 것일까??
LRU 캐시란??
Least Recently Used Cache의 약자로, 캐시메모리를 다루는 알고리즘중에 가장 많이 사용되는 알고리즘이다. Cache메모리가 차면, 가장 오랫동안 사용되지 않았던 Cache를 메모리에서 삭제하는 알고리즘이다.
LRU 캐시의 구현
LRU캐시는 Doubly Linked List(Queue)를 통해서 구현된다. head에 가까울수록 최근에 사용된 데이터이고, tail에 가까울수록 사용되지 않은 데이터이다. 만약 데이터가 사용되면 그 데이터가 head의 위치로 변경된다. 여기서 head와 tail은 실제 저장된 데이터가 아니고, 맨처음과 끝은 알려주는 역할만 한다. 그러므로 실제로 가장 최근에 사용된 데이터는 head.next(), 가장 오래된 데이터는 tail.prev()가 되겠다.
https://jins-dev.tistory.com/entry/LRU-Cache-Algorithm-정리
또한 LinkedList의 단점인 접근속도를 개선하기 위해 접근 시 Map을 함께 사용한다.
LRU캐시의 구현은 왜 WeakReference인가?
softly reachable 객체는 힙에 남아 있는 메모리가 많을수록 회수 가능성이 낮다. 즉, sortly한 객체가 되어도,(LRU캐시의 tail부분에 이르러도) 그동안의 점유시간과 사용횟수 때문에, GC에 의해 수거되지 않을 가능성이 있고, 다른 비즈니스 로직 객체들을 위해 어느 정도 비워두어야 할 힙 공간이 softly reachable 객체에 의해 일정 부분 점유된다. 따라서 전체 메모리 사용량이 높아지고 GC가 더 자주 일어나며 GC에 걸리는 시간도 상대적으로 길어지는 문제가 있다.
그렇기 때문에 SoftReference보다 WeakReference를 사용하는것이 더 효율적이다.
포스트 작성으로 알게된 점
LRU캐시의 동작원리와 구현을 보면 여태까지 배운 List, Queue, Map이 모두 쓰인다. 해당 자료구조들의 동작원리를 알기때문에 LRU캐시 동작이 잘 이해가 갔다. 마지막까지 이해가 안갔던 것은 LRU캐시를 구현할때 왜 WeakReference를 쓰는지? 였는데, SoftReference의 특징을 보고 이해가 갔다. Softly Reference가 되어도 그동안의 사용시간과 횟수 때문에 GC의 대상이 되지 않을수 있다. 즉 LRU캐시에서는 이미 참조점으로 잃어버렸는데도 메모리회수가 늦어진다는 소리이다. 그렇게되면 힙 메모리 공간에 낭비되는 생길것이며, 만약 계속해서 LRU캐시에서 삭제가 일어난다면 GC에 회수되지는 않으나 누구도 참조하지 않는 Softly Reference들이 메모리를 차지할 것이다. 즉, LRU 캐시에서 삭제되었을때 바로 GC에서 회수해 갈 수 있는 WeakReference가 더 유리하다.
그럼, 그냥 Strong을 쓰면 안되나??.....
Reference
'프로그래밍 > Java' 카테고리의 다른 글
ArrayList VS LinkedList -addOn(1) (0) | 2021.05.27 |
---|---|
Set과 Queue -Reboot(1) (0) | 2021.05.27 |
Proxy-@Transactional (0) | 2021.05.25 |
Lombok 파해쳐보기 - 1(미완) (0) | 2021.05.24 |
ArrayList VS LinkedList (0) | 2021.05.21 |