Closed shoeone96 closed 1 month ago
많은 일들 하느라 고생 많으셨습니다 중원님!
이번에도 한 수 배워갑니다..
heap 문제해결 관련해서 두 가지 여쭤보고 싶습니다
@sunwon12
위에 남겨주신 질문에 대해서는 조회 API 부하테스트 중 heap 메모리가 정상적으로 동작하지 않는 API를 발견하였고 그 과정에서 어떤 객체가 쌓여있길래 heap 메모리가 잘못작동하는 걸까 추적하던 도중 LinkedHashMap을 heap dump 스냅샷과 실제로 API 에서 호출하는 메서드를 따라가면서 어떤 객체가 생성되는지 하나하나 살펴본 결과 확인할 수 있었습니다.
name: "✅ Feature" about: Feature 요구 사항을 입력해주세요. title: "✅ Feature" labels: ✅ Feature assignees: ''
History
🚀 Major Changes & Explanations
1. LinkedHashMap heap 메모리 차지하는 문제 해결
게시글 조회 시 추출한 데이터를 정재하기 위해 LinkedHashMap이 다수 사용되는 것을 확인
LinkedHashMap은 서로 참조가 강하게 묶여있어 GC로 잘 사라지지 않는 객체이다.
사용이 끝난 LinkedHashMap에 대하여 map.clear()메서드를 사용하여 그 즉시 객체를 비워줌
부하테스트 후 남아있던 LinkedHashmap 객체가 사라짐을 확인 가능
before(약 10분간 LinkedHashMap 객체가 Heap 영역에 남아있음을 확인)
After(부하테스트 요청 후 바로 객체가 사라짐을 확인)
2. 매번 호출되는 요청에 대해 캐싱 도입
캐싱 적용 전
캐싱 적용 후
성능 약 10배 이상 향상 확인
1시간 마다 랭킹 업데이트 시 정렬 순서가 같이 업데이트 되게 설정
업데이트가 시작될 때 키가 사라지고 다시 같은 요청을 날리면 캐시에 들어가는 걸 확인
업데이트가 안되는 경우를 위해 캐싱 시간을 30분으로 설정(랭킹 업데이트 시 CacheEvict가 모종의 이유로 제대로 작동 안할 가능성)
📷 Test Image
💡 ETC