• 沉淀的梦想
    2019-11-08
    看了很多关于并发收集的文章,但是还是云里雾里的,感觉得对照着GC的实现源码学习才能明白

    作者回复: 推荐你看两个GC的源代码:一个是Lua的,一个是Juila的。我最近时间不充裕,不够时间自己写一个GC。但我后面会补上。

    
     2
  • LEGEND OF HEART
    2019-11-08
    曾经在生产环境遇到过GC的问题,我们做的是一个数据监控系统。当时的现象是,程序偶现会在某些时间点丢数据,然后程序的粒度是秒级别的,所以丢数据用户感知会很强烈。一开始是怀疑程序bug导致数据采集错误,但是想了很久,查了日志,做了很多测试都没有复现。后来想到是不是GC影响的,用GC Viewer查看了GC日志,果然,发现了程序耗费了很多时间在full GC上,占了运行时间的42.8%。基本明白了是GC的问题之后,我就开始想,是不是程序分析的无用数据太多了?还是程序的运行内存开的太小了?还是说垃圾收集器选择的有问题?试了一下,清理了一些无用数据,并将程序内存调大,运行了一段时间,gc的次数和时间明显减少了。上面的案例,算是一次简单的GC问题定位吧,后续其实还是出现了几次GC问题,仿照上面的思路,看看GC日志,基本也可以把问题找出来。

    作者回复: 非常感谢你的经验分享!GC是调优的重要环节。

    
     1
  • Huayra
    2020-02-06
    Go的GC不是分代的,Java的是;使用的是并发三色标记算法。
    GC可以看看《垃圾回收的算法与实现》这本书。
    Go的STW 在1.8版本已经优化到毫秒以下了。
    
    
  • Lamont
    2020-01-16
    这时,新空间里所有对象整齐排列,没有内存碎片。

    这里的“新空间”应该改为“旧空间”。
    
    
  • Lamont
    2020-01-15
    整个标记过程的直观示意图如下

    这句话下面的图中似乎缺少了一步:
    标记D,逆转A->D的指针
    
    
我们在线,来聊聊吧