我目前正在使用简单的Hazelcast
IMAP<String, byte[]>
。
如果我使用myMap.delete(key)
从地图中删除条目,则该值已成功从地图中删除。与此并行,我监视JVM
,发现GC
从未从堆内存中删除对象(必须仍然有对该对象的引用)。
从我的角度来看,似乎只有Hazelcast TTL Eviction policy
清除了heap
。所以我的问题是,我应该使用myMap.evict(key)
而不是delete
来清除Java内存吗?如果是,为什么?
evict
上的delete
和IMap
有什么区别?
答案 0 :(得分:0)
如果您的Imap由数据库表支持
删除:条目已从Imap和数据库表中删除
驱逐:仅从Imap中删除条目。它仍然存在于数据库表中
HZ内部使用逐出,以清除根据逐出策略必须删除的缓存。
现在,此逐出只是发生在Imap中,而不是对应于它的DB表。
以例子
情况1 :Hz具有2个条目:(K1,V1)(K2,V2)
驱逐(K1)
此时,Imap只有1个值(K2,V2),DB表将同时具有两个条目(K1,V1)(K2,V2)
获取(K1)
查找将以这种方式进行缓存-> NearCache->数据库表
在这里,您将从DB表中获得响应,并且缓存(Iamp)将再次填充(K1,V1)
情况2 :Hz具有2个条目:(K1,V1)(K2,V2)
删除(K1)
条目现在已从Imap和数据库表中删除
Get(K1)结果为空