Effective-Tilinkle / effective-java

0 stars 3 forks source link

[item7] WeakHashMap 은 언제쓰는게 좋을까? #10

Closed KimJeongHoon3 closed 1 year ago

KimJeongHoon3 commented 1 year ago
  1. 간단하게 이해한바로는 Map 에 데이터 사용다하고 지우는것을 까먹을 수 있으니, WeakHashMap이 이럴때 사용될수 있다는것 같은데, 티링에선 어떤곳에서 깔쌈하게 사용할 수 있을까요?

  2. p39에서 아래와같이 WeakHashMap을 활용하여 콜백을 해지하는 방법을 소개해주는데, 어떤식으로 활용하면 좋을지.. 감이 잘 안오네요 ㅠ

    콜백을 약한참조로 저장하면 가비지 컬렉터가 즉시 수거해간다. 예를 들어 WeakHashMap에 키로 저장하면 된다.

HwangSeonHo commented 1 year ago

음.. 티링 로직들이 전부 뎁스가 깊고 앞단에서부터 가져와서 서로 다른 뎁스에서 사용하는 데이터들이 많은데 (결합도가 높아서 이렇게 사용하면 안되겠지만 이미 그렇게 되어있어서..) 그 앞단의 데이터들을 이 WeakHashMap에 넣고 쓰면 뎁스 들어가고 나올때 필요없어지는 데이터들은 Map에서 지워지니까 유용하지 않을까 생각했었어요

예를들면 예매dto가 { {예매취소} {결제취소} {취소표이관} } 모든 블록에서 사용하는데 {예매취소}에서도 뭔가 데이터를 집어넣고빼고 {취소표이관}에서도 데이터를 집어넣고빼고 하는데

WeakHashMap 예매dto라면 {예매취소}에서 예매dto로 집어넣은 데이터가 블록 빠져나오면서 참조가 사라지면 같이 map에서도 지워지게되고 {취소표이관}에서는 필요없는 예매취소데이터는 지워지는 식으로요.. 근데 이게 이해한게 맞나 모르겠네요

아니면 캐시에 많이 쓰인다고 하니까 상품을 참조하는 상품 정보 캐시에 쓰다가 판매 완료 된 상품은 상품만 참조를 지워버리면 상품 정보도 함께 날아가니까 편리 할 것 같습니다.

makga87 commented 1 year ago

저희 ehcache에선 WeakReference말고 SoftReference를 쓰더라구요, WeakHashMap은 gc가 일어나면 바로 제거 대상이지만, SoftReference는 메모리가 부족하기전까진 잠시 제거를 안하고 있는듯합니다.

그 외에 내부적으로 사용처를 확인해보니 결과는 다음과 같습니다.

  1. org.apache.commons.httpclient.MultiThreadedHttpConnectionManager의 커넥션 관리용
  2. 자바 코어 api의 클래스로더
  3. aspectjweaver 코어에도 있다
  4. 하이버네이트

자주 쓰이는 듯 보이나, 저희같은 서비스 쪽에서는 사용할 구멍을 찾기가 좀 어려워보여요

pjhsk113 commented 1 year ago

괜찮은 블로그를 찾아서 공유드립니다~ https://blog.breakingthat.com/2018/08/26/java-collection-map-weakhashmap/

makga87 commented 1 year ago

괜찮은 블로그를 찾아서 공유드립니다~ https://blog.breakingthat.com/2018/08/26/java-collection-map-weakhashmap/

오 나도 여기보고 예제코드 만들었는데 ㅋㅋㅋ

pjhsk113 commented 1 year ago

2번 질문도 잘 정리되어있는 블로그가 있어 공유드립니다 ㅎㅎㅎ https://javabom.tistory.com/14

KimJeongHoon3 commented 1 year ago

한가지 의문점이 더 생기는 코드를 봐버렸네요..

스크린샷 2023-02-22 오후 3 12 19

이따 모임때 같이 이야기나눠봐요~~

KimJeongHoon3 commented 1 year ago
스크린샷 2023-02-27 오전 10 25 01