2017-12-12 42 views
1
private Cache<Object, String> cache = CacheBuilder.newBuilder() 
     .concurrencyLevel(4) 
     .expireAfterAccess(24, TimeUnit.HOURS) 
     .initialCapacity(1024) 
     .maximumSize(1_00_000) 
     .build(); 
private ConcurrentMap<Object, String> cacheMap = cache.asMap(); 

이것은 내 코드입니다. 간단하며 단지 구아바 맵 캐시를 만드는 것입니다. 질문 :이지도에서 키를 제거하면 GC가이지도에서 메모리를 회수 할 수 있습니까? weakReference를 사용하지 않고 (Set 나 Map 등의 네스트 오브젝트를 저장하지 않는다.)?키를 제거하면 구아바 맵 캐시가 줄어 듭니다.

답변

3

Guava's Cache.asMap javadoc (강조 광산)에서 :

는 스레드 안전지도 등이 캐시에 저장된 항목의 뷰를 돌려줍니다. 지도를 수정하면 캐시에 직접 영향을줍니다.

그리고 Guava's Cache Explained wiki page에서 :

언제든지, 당신은 명시 적으로 오히려 항목이 퇴거 할 때까지 기다리지 않고 캐시 항목이 무효화 될 수 있습니다.

강조 표시된 섹션 대신 전체 wiki 페이지를 확인하고 싶을 수도 있습니다.

+0

감사합니다. 그러나 invalidate()는 내가 물어 본 질문이 아닌 축출 기능입니다. 내가 커버 아래에 알고 싶었어요, 구아바 캐시의 implRes는 arrayRef의 크기를 객체로 축소합니다. – linehrr

+0

@linehrr [예, 소스 코드에 따라] (https://github.com/google/guava/blob/master/guava/src/com/google/common/cache/LocalCache.java) :'LocalManualCache'가 반환됩니다. asMap을 통해 내부 ConcurrentMap이다. 따라서 기본지도가 실제로 축소되었습니다. –