hazelcast Java 系缓存,如何保证不被 GC

2020-07-10 19:51:41 +08:00
 pkwenda
如题,假设全部入 key 过期时间 1 年,内存 1g,

在 java 内存中,数据是如何存储才能让 JVM 知道这些数据都是不能被清理的呢,否则把我存入的数据 GC,岂不是违背了缓存的意义。难道有某个强引用一直引用虚拟机内所有的对象?还没看源码,留个问号 。
2222 次点击
所在节点    Java
8 条回复
pkwenda
2020-07-10 20:10:22 +08:00
大概意思就是缓存的数据,时间没到,不应该被 GC,要么死:OOM, 要么 缓存过期 :解除引用,GC -> 内存释放 ?
dncba
2020-07-10 20:18:17 +08:00
GCRoot 了解下。能通过 GCRoot 找到你的数据就不会被 GC
pkwenda
2020-07-10 20:23:22 +08:00
@dncba #2 那是肯定的,我没搞懂的是 ,怎么引用千百万个对象,而且想解除引用就解除引用。
dncba
2020-07-10 20:28:04 +08:00
@pkwenda 把对象塞到一个集合里,GCRoot 持有集合引用就行了。
cxshun
2020-07-10 20:46:28 +08:00
缓存一般情况下都是通过一个 map 来实现,而你的缓存对象,都是被 put 入 map 里面的,也即是在 map 里面的 table 属性里面或者其他属性,那么此时 GCRoot 就可到达,当然就不会被 GC 了。
hantsy
2020-07-10 21:13:50 +08:00
@cxshun 一般缓存实现 Weak 的版本用得多。

1,缓存不一定是放内存,第一次用 Ehcache 的时候知道缓存也是要有写硬盘的策略。
2,实现方式太多样了。HazelCast 这种产品就太复杂了,不可能用简单的 Map 之类的去实现了,类似 DataGrid 产品太多了,Redhat 有 Infinispan,Ehcache 也有服务器版本。
ljzxloaf
2020-07-10 21:25:34 +08:00
main thread 持有的 cachemanager,cachemanager 持有 cache 集合
cxshun
2020-07-12 14:11:01 +08:00
@hantsy #6 嗯,对的。但其实 weak 的版本就会面临楼主说的问题,在 GC 的情况下有可能就会被回收了。如果让我来实现,我可能会考虑直接用 Strong 的,避免我们依赖的一些比较重要的缓存被回收(当然,重要就不应该只用缓存,要有另外的缓存措施)
1 、不是绝对哈,redis 照样可以 rdb 或 aof 到硬盘,最后还是在内存中处理。ehcache 我个人不了解,不好评价哈。
2 、嗯嗯,我同意。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/689008

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX