V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
pkwenda
V2EX  ›  Java

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

  •  
  •   pkwenda ·
    pkwenda · 2020-07-10 19:51:41 +08:00 · 2214 次点击
    这是一个创建于 1378 天前的主题,其中的信息可能已经有所发展或是发生改变。
    如题,假设全部入 key 过期时间 1 年,内存 1g,

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

    1,缓存不一定是放内存,第一次用 Ehcache 的时候知道缓存也是要有写硬盘的策略。
    2,实现方式太多样了。HazelCast 这种产品就太复杂了,不可能用简单的 Map 之类的去实现了,类似 DataGrid 产品太多了,Redhat 有 Infinispan,Ehcache 也有服务器版本。
    ljzxloaf
        7
    ljzxloaf  
       2020-07-10 21:25:34 +08:00 via Android   ❤️ 1
    main thread 持有的 cachemanager,cachemanager 持有 cache 集合
    cxshun
        8
    cxshun  
       2020-07-12 14:11:01 +08:00
    @hantsy #6 嗯,对的。但其实 weak 的版本就会面临楼主说的问题,在 GC 的情况下有可能就会被回收了。如果让我来实现,我可能会考虑直接用 Strong 的,避免我们依赖的一些比较重要的缓存被回收(当然,重要就不应该只用缓存,要有另外的缓存措施)
    1 、不是绝对哈,redis 照样可以 rdb 或 aof 到硬盘,最后还是在内存中处理。ehcache 我个人不了解,不好评价哈。
    2 、嗯嗯,我同意。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1009 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 22:18 · PVG 06:18 · LAX 15:18 · JFK 18:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.