我目前正在使用一个简单的Hazelcast IMAP<String, byte[]>。
如果我使用myMap.delete(key)从映射中删除条目,则该值将成功地从映射中删除。与此并行,我监视JVM,并且我看到对象从未被GC从堆内存中移除(必须仍然有对对象的引用)。
在我看来,似乎只有我们的Hazelcast TTL Eviction policy清除了heap。所以我的问题是,我应该使用myMap.evict(key)而不是delete来清除Java内存吗?如果是,为什么?evict和delete在IMap上的区别是什么?
发布于 2020-06-18 07:53:55
如果Imap由DB表支持
驱逐是由HZ内部使用,以清除缓存,必须删除根据驱逐策略。
现在,这个驱逐是从Imap中发生的,而不是对应于它的DB表。
以例
案例1:Hz有两个条目:(K1,V1) (K2,V2)
驱逐(K1)
此时,Imap只有一个值(K2,V2),DB表将同时包含两个条目(K1,V1) (K2,V2)。
Get(K1)
查找将以这种方式进行-> NearCache -> DB表
在这里,您将从DB表获得响应,缓存(Iamp)将再次被填充(K1,V1)。
案例2:Hz有两个条目:(K1,V1) (K2,V2)
移除(K1)
条目现在从Imap和DB表中删除。
Get(K1)结果为空
https://stackoverflow.com/questions/54222044
复制相似问题