Java에서 강력한 참조, 소프트 참조, 약한 참조 및 가상 참조의 용도는 무엇입니까?
지난 이틀 동안 레퍼런스 관련 내용을 살펴보았는데 많이 접해보지는 못했지만 그래도 꽤 유용하다는 느낌이 듭니다.
기억이 매우 중요한 경우 유용할 수 있습니다.
특정 객체가 GC될 때 알림을 받고 관련 처리를 수행해야 할 때 유용할 수 있습니다.
첫 번째로 현재 우리가 노출하고 있는 것은 WeakHahsMap입니다. 일반적으로 캐시를 작성할 때 가장 간단한 방법은 캐시를 클래스에 넣는 것입니다.
public static Map
그런 다음 전 세계적으로 사용하십시오. 여기에서 Tomcat이 구현한 LRU 캐시를 참고할 수 있습니다: tomcat/ConcurrentCache.java at trunk · apache/tomcat · GitHub에서는 WeakHashMap을 사용하고 있으며 WeakHashMap도 WeakReference를 사용하고 있으니 참고하시면 됩니다.
WeakHahsMap의 구현 원리는 단순히 내부의 Entry가 WeakReference를 상속한 다음 Entry 키가 더 이상 사용되지 않을 때, 즉 GC일 때 Entry가 WeakHashMap의 ReferenceQueue에 진입한다는 것입니다. 해당 메소드를 호출하면 ReferenceQueue에서 Entry가 삭제되고 관련 처리가 수행됩니다(즉, 키가 삭제됩니다). 이때 키-값 쌍 중 하나가 사라진 것을 확인할 수 있습니다.
두 번째로 현재 노출된 것은 FileCleaningTracker입니다. 그 기능은 파일을 개체와 연결하는 것입니다. 개체가 GC되면 파일도 삭제됩니다.
FileCleaningTracker 구현에서는 단순히 가상 참조를 사용합니다. PhantomReference에서 상속된 Tracker의 내부 클래스가 있습니다. WeakHashMap의 항목으로 이해할 수 있습니다(실제로는 매우 유사합니다). 이 Tracker는 관련 개체 마커와 연결됩니다(WeakHashMap의 Entry 키로 이해할 수 있음). 그런 다음 마커가 재활용되면 Tracker가 GC에 의해 ReferenceQueue로 이동되고 FileCleaningTracker가 Tracker를 제거합니다. ReferenceQueue를 제거하고 관련 작업(파일 삭제)을 수행합니다.
마지막으로:
당신이 이해하는 참조(강함, 소프트, 약함)는 GC와 더 관련이 있습니다. 객체가 GC일 때 애플리케이션에 알림을 보낸 다음 관련 작업을 수행할 수 있습니다. . WeakHashMap의 경우가 그렇습니다. 하위 계층에서는 키가 사라진 것을 발견하고 상위 계층에서는 해당 항목을 삭제합니다.
ps:
6조: 만료된 개체에 대한 참조 제거(WeakHashMap 캐싱 애플리케이션): 되돌아볼 시간이 없기를 바랍니다
6조 : WeakHashMap 확장 지식 1(참조 관련 원리): 뒤돌아볼 시간이 없다
6조: 참조 응용 프로그램-FileCleaningTracker: 뒤돌아 볼 시간이 없다
마지막 추가입니다. . .
직장에서 이런 상황에 휘말리게 되면서 매일 유저들이 투자한 돈에 대해 금리를 올려야 한다는 생각이 문득 떠올랐다. 어느 날 고객이 금리 인상을 잊어버렸다. 그런 다음 csv 파일을 받고 추가하라는 요청을 받았습니다.
당시 내가 한 일은 운영 및 유지 관리팀에서 파일을 고정된 위치에 두고 프로그램이 이를 읽고 로직을 실행한 다음 운영 및 유지 관리팀에서 수동으로 삭제하는 것이었습니다. 이때 실제로 이 FileCleaningTracker를 사용하면 파일을 읽은 후 자동으로 삭제하여 운영 및 유지 관리가 필요하지 않게 됩니다. (이것은 적용 시나리오일 수 있습니다)