IMap.delete和IMap.evict之间的区别

时间:2019-01-16 17:09:08

标签: java hazelcast hazelcast-imap

我目前正在使用简单的Hazelcast IMAP<String, byte[]>

如果我使用myMap.delete(key)从地图中删除条目,则该值已成功从地图中删除。与此并行,我监视JVM,发现GC从未从堆内存中删除对象(必须仍然有对该对象的引用)。

从我的角度来看,似乎只有Hazelcast TTL Eviction policy清除了heap。所以我的问题是,我应该使用myMap.evict(key)而不是delete来清除Java内存吗?如果是,为什么? evict上的deleteIMap有什么区别?

1 个答案:

答案 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)结果为空