能否在 JVM 堆中开辟一块空间由自己控制不参与 JVM 的 GC - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xianyuya
V2EX    Java

能否在 JVM 堆中开辟一块空间由自己控制不参与 JVM 的 GC

  •  
  •   xianyuya 2020-12-31 17:47:38 +08:00 3298 次点击
    这是一个创建于 1750 天前的主题,其中的信息可能已经有所发展或是发生改变。
    应用中有大量常驻老年代的对象(例如本地缓存),每次进行替换的时候大概率引起 cms gc,从而导致 rt 抖动,已知这部分对象是一定会进老年代的,并且替换频率很低,基本上一天一次,那么有没有可能在堆里面开辟一块空间专门来存放这部分数据,这部分空间中的对象的更新和删除都由应用代码控制,不参与 GC,这样既能减少 cms gc 次数和频率,又因为数据本身还是放在堆中的,无需再进行序列化,同放在堆外相比内存占用和性能都会比较好
    19 条回复    2021-01-22 12:17:28 +08:00
    DeathBless
        1
    DeathBless  
       2020-12-31 17:50:02 +08:00
    把比例调一下不是更方便
    除非你用堆外内存 不然不可能吧
    micean
        2
    micean  
       2020-12-31 18:04:15 +08:00
    像 netty 这种有玩堆外内存的,堆内的就不了解了
    嫌本地缓存占用空间大,为什么不把缓存交给 redis 之类的应用?
    YouLMAO
        3
    YouLMAO  
       2020-12-31 18:36:52 +08:00
    堆里面?你啥意思?颠覆 jvm 概率么
    native 或者叫 off heap,

    代码
    java.nio.DirectByteBuffer
    unsafe.allocateMemory
    imjamespond
        4
    imjamespond  
       2020-12-31 18:46:37 +08:00 via Android
    Ehcache 了解下?
    YouLMAO
        5
    YouLMAO  
       2020-12-31 19:23:32 +08:00
    @YouLMAO 颠覆 java 概念
    MeteorCat
        6
    MeteorCat  
       2020-12-31 19:25:27 +08:00 via Android
    JNI 这样的吗?
    gabon
        7
    gabon  
       2020-12-31 19:49:21 +08:00 via Android
    前两天刚看到一个开源软件在堆开辟空间自己管理,现在怎么也想不起来了,好难受
    littlewing
        8
    littlewing  
       2020-12-31 19:53:03 +08:00
    自己管理内存堆外就行了,为啥非得在堆内
    gabon
        9
    gabon  
       2020-12-31 19:53:47 +08:00 via Android
    got it 。Flink 解决内存问题的核心思想类似于 Spark 的 Project Tungsten 和 HBase 的 BlockCache:在 JVM 堆内或堆外实现显式的内存管理,即用自定义内存池来进行内存块的分配和回收,并将对象序列化后存储到内存块。因为内存可以被精准地申请和释放,而且序列化的数据占用的空间可以被精确计算,所以组件可以对内存有更好的掌控,这种内存管理方式也被认为是相比 Java 更像 C 语言化的做法。

    Flink 将 TaskManager 的运行时 JVM heap 分为 Network Buffers 、MemoryManager 和 Free 三个区域,如下图所示:
    gabon
        10
    gabon  
       2020-12-31 19:54:43 +08:00 via Android
    http://tang.love/2019/04/21/overview_of_flink/
    wysnylc
        11
    wysnylc  
       2020-12-31 20:36:06 +08:00 via Android
    堆内应该不行,堆外可以如 netty
    堆内不行的原因是 gc 没有白名单类似的策略
    YouLMAO
        12
    YouLMAO  
       2020-12-31 20:45:37 +08:00 via Android
    @gabon 没鸟用的,flink 是用二进制数据放在老年代避免 gc 的,贴主说他不想反序列化,要对象,这样的唯一出路就是加入 Amazon 团队,他们在造一个新 Jvm,拥有自主知识产权
    mind3x
        13
    mind3x  
       2020-12-31 22:12:49 +08:00
    成熟方案很多,例如好用的 http://www.mapdb.org/
    另外 JDK 14/15 也已经在标准化中了: https://openjdk.java.net/jeps/393
    mind3x
        14
    mind3x  
       2020-12-31 22:13:35 +08:00
    @mind3x 呃,没注意是问在 JVM 堆里分配,那就不相关了。
    DoctorCat
        15
    DoctorCat  
       2020-12-31 22:16:26 +08:00
    不是不行,但怎么判断你这策略是最佳实践? 或者把 gc 换成 G1 试试
    DoctorCat
        16
    DoctorCat  
       2020-12-31 22:19:02 +08:00
    把 CMS 换成 G1 试试
    xianyuya
        17
    xianyuya  
    OP
       2021-01-04 11:52:39 +08:00
    大家说的堆外其实有想过,也有一部分数据是采用 mmap 的方式读取的,不过放在堆外的数据,反序列化到堆内创建对象的时候就会有额外的内存开销。
    其实我最原始的问题是有一份一天一更新的只读数据( 1g 左右,因为性能问题所以需要放在内存中),要怎么处理才能尽可能在尽可能少占用内存的情况下,每天替换数据时不引起 stw,不对正在提供服务的 rpc 线程产生影响
    Joker123456789
        18
    Joker123456789  
       2021-01-05 15:40:38 +08:00
    static Map ;

    单例类;

    都可以实现这个需求吧
    sueking
        19
    sueking  
       2021-01-22 12:17:28 +08:00
    阿里自定义 JDK 实现了 叫 GCIH
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5860 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 34ms UTC 06:14 PVG 14:14 LAX 23:14 JFK 02:14
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86