今天小G講一下hash,今天看spring源碼的時候發現有一個地方使用weakHashMap,可能大家項目中很少用這個weakHashMap,下面就是看從spring源碼中看到一個spring
如圖在做Cglib驗證的時候出現如下:
/** Keeps track of the Classes that we have validated for final methods */
private static final Map<Class<?>, Boolean> validatedClasses = new WeakHashMap<>();
//省去其他的信息
/**
* Checks to see whether the supplied {@code Class} has already been validated and
* validates it if not.
*/
private void validateClassIfNecessary(Class<?> proxySuperClass, @Nullable ClassLoader proxyClassLoader) {
if (logger.isWarnEnabled()) {
synchronized (validatedClasses) {
if (!validatedClasses.containsKey(proxySuperClass)) {
doValidateClass(proxySuperClass, proxyClassLoader,
ClassUtils.getAllInterfacesForClassAsSet(proxySuperClass));
validatedClasses.put(proxySuperClass, Boolean.TRUE);
}
}
}
}
- 從上面看,可能大家還看不出爲什麼使用weakhash,首先小G講下,對weakHash理解,首先jvm,
gc處理器,垃圾回收,對一些弱性的引用,會直接回收內存,weakHash的key就是引用就是弱的引用,在大家不使用的時候,可以進行回收,這樣類滾動一樣
,內存一直可以循環使用,看上面其實就是爲做驗證進行的,所以使用weakhash最好不過,所以當一些緩存或者對key的存活要求不高的就可以使用; - 不過其中有一個疑問?如果大家知道可以評價解析爲小G,就是class放入到weakhash中,如果這個class被引用的話,其實這個內存就不會回收?這樣是不是很降低驗證,不過這個也可能是spring令一個特殊點,其實class後續進行釋放,不知道這個回答對不對,獻醜