如题,假设全部入 key 过期时间 1 年,内存 1g,
在 java 内存中,数据是如何存储才能让 JVM 知道这些数据都是不能被清理的呢,否则把我存入的数据 GC,岂不是违背了缓存的意义。难道有某个强引用一直引用虚拟机内所有的对象?还没看源码,留个问号 。
在 java 内存中,数据是如何存储才能让 JVM 知道这些数据都是不能被清理的呢,否则把我存入的数据 GC,岂不是违背了缓存的意义。难道有某个强引用一直引用虚拟机内所有的对象?还没看源码,留个问号 。
1
pkwenda OP 大概意思就是缓存的数据,时间没到,不应该被 GC,要么死:OOM, 要么 缓存过期 :解除引用,GC -> 内存释放 ?
|
2
dncba Jul 10, 2020
GCRoot 了解下。能通过 GCRoot 找到你的数据就不会被 GC
|
5
cxshun Jul 10, 2020
缓存一般情况下都是通过一个 map 来实现,而你的缓存对象,都是被 put 入 map 里面的,也即是在 map 里面的 table 属性里面或者其他属性,那么此时 GCRoot 就可到达,当然就不会被 GC 了。
|
6
hantsy Jul 10, 2020
@cxshun 一般缓存实现 Weak 的版本用得多。
1,缓存不一定是放内存,第一次用 Ehcache 的时候知道缓存也是要有写硬盘的策略。 2,实现方式太多样了。HazelCast 这种产品就太复杂了,不可能用简单的 Map 之类的去实现了,类似 DataGrid 产品太多了,Redhat 有 Infinispan,Ehcache 也有服务器版本。 |
7
ljzxloaf Jul 10, 2020 via Android main thread 持有的 cachemanager,cachemanager 持有 cache 集合
|