• 请不要在回答技术问题时复制粘贴 AI 生成的内容
lxbjkben
V2EX  ›  程序员

Java 主动 GC 功能

  •  
  •   lxbjkben · Jun 21, 2018 · 5421 views
    This topic created in 3056 days ago, the information mentioned may be changed or developed.
    在厂里上班时候撸了一个根据 old gen 百分比在特定时间段触发 cms gc 的的小功能,simple yet useful : )
    https://github.com/vipshop/vjtools/issues/39
    Supplement 1  ·  Jun 26, 2018

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

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

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

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

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

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

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

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

    可达路径分析了解一下~
    ShineSmile
    ShineSmile
    Jun 22, 2018
    19
    @seancheer 能举个例子么?
    ShineSmile
    ShineSmile
    Jun 22, 2018
    20
    @seancheer 算了 大家各自自以为是吧
    不是研究 PL 的 也不想撕
    lxbjkben
    lxbjkben
    OP
    Jun 26, 2018
    21
    @yanaraika 3500 刀一个 vm,只有不差钱的金融行业用的起吧。
    lxbjkben
    lxbjkben
    OP
    Jun 26, 2018
    22
    @rim99 在安全时间内尝试主动触发,避免峰值流量时候 gc 造成停顿。
    lxbjkben
    lxbjkben
    OP
    Jun 26, 2018
    23
    @neoblackcap G1 只有大堆会减少超长 GC,小堆没区别。
    ShineSmile
    ShineSmile
    Jun 27, 2018
    25
    @dbpe 哈哈哈
    刚在 V2EX 看到那个公司的软文 2333333333
    seancheer
    seancheer
    Jul 3, 2018
    26
    @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 同样的操作和这里的结果是一样的。
    }
    ``
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   5469 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 48ms · UTC 02:49 · PVG 10:49 · LAX 18:49 · JFK 21:49
    ♥ Do have faith in what you're doing.