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

Java 主动 GC 功能

  •  
  •   lxbjkben · 2018-06-21 12:51:16 +08:00 · 4363 次点击
    这是一个创建于 2348 天前的主题,其中的信息可能已经有所发展或是发生改变。
    在厂里上班时候撸了一个根据 old gen 百分比在特定时间段触发 cms gc 的的小功能,simple yet useful : )
    https://github.com/vipshop/vjtools/issues/39
    第 1 条附言  ·  2018-06-26 15:47:30 +08:00

    线上使用的实际效果: proactive gc task result

    26 条回复    2018-07-03 19:33:07 +08:00
    metrxqin
        1
    metrxqin  
       2018-06-21 15:09:57 +08:00
    你确定真的有必要?
    neoblackcap
        2
    neoblackcap  
       2018-06-21 15:17:44 +08:00
    其实我觉得你们需要换 GC 算法,毕竟 G1 的回收已经很快了,听说下一代也要学 Azual,搞 pauseless gc,垃圾回收可以在 heap 上 T 的时候低至 10ms,不需要人工接入。
    ShineSmile
        3
    ShineSmile  
       2018-06-21 15:24:53 +08:00
    面试的时候面试官说 java 的 GC 是引用计数
    是真的么?
    那遇到循环引用可咋办。
    dbpe
        4
    dbpe  
       2018-06-21 15:58:44 +08:00
    @ShineSmile 说明那个面试官,没去了解 java 的 gc 机制。。现代化的虚拟机 gc 算法都是路径是否可达的方式来的。

    计数器的方式。。远古的虚拟机好像也没有用这种方式的。。
    ren2881971
        5
    ren2881971  
       2018-06-21 16:11:38 +08:00
    从没主动回收过。。
    yanaraika
        6
    yanaraika  
       2018-06-21 16:22:47 +08:00 via Android
    现在一堆公司问 /搞 JVM 调优就不会花 3500 刀买个 Azul Zing JVM? 况且很多时候面试官和被面试者的理解都是错的

    总之不到万不得已不要搞跨层优化,底层一变就成了负优化
    wwqgtxx
        7
    wwqgtxx  
       2018-06-21 16:28:36 +08:00
    @dbpe 直到现在 CPython 还在用引用计数呢,貌似也 并不 远古
    xeaglex
        8
    xeaglex  
       2018-06-21 16:32:23 +08:00 via Android
    @dbpe C++智能指针用的是计数器
    dbpe
        9
    dbpe  
       2018-06-21 16:38:22 +08:00
    @xeaglex
    @wwqgtxx
    好吧。。我孤陋寡闻了
    micean
        10
    micean  
       2018-06-21 16:41:10 +08:00
    自己塞满内存去触发 GC 完全没有必要吧
    copie
        11
    copie  
       2018-06-21 16:46:16 +08:00 via Android
    @ShineSmile Python 使用的是引用计数。处理循环引用使用标记-清除。为了加速使用了分代回收。虽然简单但是有效。
    DRcoding
        12
    DRcoding  
       2018-06-21 17:20:02 +08:00   ❤️ 1
    Start 还挺多的,不过反正我是不敢在线上用这玩意。。。。
    ShineSmile
        13
    ShineSmile  
       2018-06-21 18:09:56 +08:00
    @dbpe
    是一次糟糕的面试体验
    不过最终也没选中我
    因为我是搞.NET 的(逃

    只是想吐槽现在好多做技术的人云亦云,照本宣科
    而且有的书的内容还是错的

    歪楼
    还有典型的:作为参数传递时:值类型不可以修改,而引用类型“可以修改“
    实际上都不能改,因为分别传的是值的副本和引用的副本。
    看到书上修改引用类型对象的属性,就认为引用类型“可改”。
    实际上原引用和引用的副本都指向同一个对象。
    所以属性是更新是有效的。

    当然,
    C#还可以用 ref 啊 out 啊来传递引用本身。
    java 还真太清楚……
    seancheer
        14
    seancheer  
       2018-06-21 20:04:21 +08:00
    @ShineSmile
    java 只有值传递,没有引用传递。
    就像你说的,很多人把引用和引用副本指向同一个对象错误的理解成了引用传递。
    Raymon111111
        15
    Raymon111111  
       2018-06-21 22:28:31 +08:00
    这个思路当然有用

    我们业务高峰发生 GC 就是一大堆超时, 一般会在低峰期定时去 GC 躲开高峰期的 GC 行为
    rim99
        16
    rim99  
       2018-06-22 07:52:34 +08:00 via iPhone
    先码一下。
    cms 不是本来就要指定 old gen 百分比来触发 gc 么?
    CYKun
        17
    CYKun  
       2018-06-22 08:31:51 +08:00 via Android
    挑个刺:阀值→阈值
    balamiao
        18
    balamiao  
       2018-06-22 11:50:28 +08:00
    @ShineSmile 引用计数,呵呵了

    可达路径分析了解一下~
    ShineSmile
        19
    ShineSmile  
       2018-06-22 12:38:11 +08:00
    @seancheer 能举个例子么?
    ShineSmile
        20
    ShineSmile  
       2018-06-22 12:41:12 +08:00
    @seancheer 算了 大家各自自以为是吧
    不是研究 PL 的 也不想撕
    lxbjkben
        21
    lxbjkben  
    OP
       2018-06-26 11:37:42 +08:00
    @yanaraika 3500 刀一个 vm,只有不差钱的金融行业用的起吧。
    lxbjkben
        22
    lxbjkben  
    OP
       2018-06-26 11:38:53 +08:00
    @rim99 在安全时间内尝试主动触发,避免峰值流量时候 gc 造成停顿。
    lxbjkben
        23
    lxbjkben  
    OP
       2018-06-26 11:42:59 +08:00
    @neoblackcap G1 只有大堆会减少超长 GC,小堆没区别。
    ShineSmile
        25
    ShineSmile  
       2018-06-27 15:59:01 +08:00
    @dbpe 哈哈哈
    刚在 V2EX 看到那个公司的软文 2333333333
    seancheer
        26
    seancheer  
       2018-07-03 19:33:07 +08:00
    @ShineSmile 不好意思,才看到。举个 c 里面的例子

    ``c


    struct S_YourStruct{
    int age;
    }

    typedef struct S_YourStruct YourStruct;
    void main()
    {
    YourStruct* p = (YourStruct*)malloc(sizeof(YourStruct ));
    //不判断有没有申请成功了
    memset(p,0,sizeof(YourStruct));
    p->age = 11;
    func(p);
    }

    void func(YourStruct * p)
    {
    p->age = 100; //这里修改也会在 main 中的 p 生效,因为指针都指向同一个对象
    p = (YourStruct*)malloc(sizeof(YourStruct )); //修改了 p 指针的指向,但是 main 中的 p 没有受到影响,对于指针本身来讲,实际上是 [值传递] ,而并非 [引用传递] ,Java 里面也是同样的道理,本质上都是 [值传递] ,Java 同样的操作和这里的结果是一样的。
    }
    ``
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4809 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 01:16 · PVG 09:16 · LAX 17:16 · JFK 20:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.