• 我测了一下。用另一个 terminal 执行 sync; echo 3 > /proc/sys/vm/drop_caches 可以把 cache drop 掉

  • Linux 对内存极端不够的场景确实是会直接 kill 掉的,这一点非常。。。但 Linux 有一个指令可以清空掉 buffer 和 cache 的内存来方便调试,你可以找一下。

  • 如果你使用 htop 查看进程的话,内存里黄色的和蓝色的这块,就分别是 buffered 和 cached 内存。

    Linux 倾向于不直接释放,并吃满内存以做缓存加速系统运行,只有当内存不够时再去释放掉。这一点在 Windows 上从 Windows Vista 中也引入了这一特性。Mac 上不出意外也是有的,只是因为你一直在用,所以被慢慢释放掉了。

  • 你测 sys_mem 的方法是 RSS,对 RSS 的定义如下

    Resident Set Size = how much memory is allocated to that process and is in RAM (including shared memory!). This includes all stack and heap memory and shared libraries, as long as they are in RAM. It does not include memory which is swapped out.

    操作系统会通过 shared memory 对内存进行缓冲(buffered),以使得重启线程或程序后能更快加载,这是 Linux 的内存管理特性,只有当系统本身内存不够用时,才会去释放这部分 buffered 的内存。程序本身不能主动释放自己的缓存内存。

  • 用 CentOS 跑了一下

    [root@6d454a5b971b /]# ruby -v
    ruby 2.5.3p105 (2018-10-18 revision 65156) [x86_64-linux]
    [root@6d454a5b971b /]# vi gc.rb
    [root@6d454a5b971b /]# ruby gc.rb
    created a json file: 52866672[50.42 MB]
    init the json file at the first launch, please run again.
    [root@6d454a5b971b /]# ruby gc.rb
    ruby 2.5.3p105 (2018-10-18 revision 65156) [x86_64-linux]
        sys_mem:9.48 MB, objspace_mem:4.15 MB
    3s  sys_mem:9.62 MB, objspace_mem:3.46 MB
    6s  sys_mem:9.63 MB, objspace_mem:3.46 MB
    9s  sys_mem:9.63 MB, objspace_mem:3.46 MB
    read content from file 52866672[50.42 MB]
    12s sys_mem:60.12 MB, objspace_mem:53.88 MB
    15s sys_mem:60.12 MB, objspace_mem:53.88 MB
    18s sys_mem:60.12 MB, objspace_mem:53.88 MB
    21s sys_mem:60.12 MB, objspace_mem:53.88 MB
    24s sys_mem:60.12 MB, objspace_mem:53.88 MB
    27s sys_mem:60.12 MB, objspace_mem:53.88 MB
    30s sys_mem:60.12 MB, objspace_mem:53.88 MB
    33s sys_mem:60.12 MB, objspace_mem:53.88 MB
    36s sys_mem:60.12 MB, objspace_mem:53.88 MB
    39s sys_mem:60.12 MB, objspace_mem:53.88 MB
    parse json string to object
    43s sys_mem:360.47 MB, objspace_mem:322.96 MB
    46s sys_mem:360.54 MB, objspace_mem:322.96 MB
    50s sys_mem:360.54 MB, objspace_mem:322.96 MB
    53s sys_mem:360.54 MB, objspace_mem:322.96 MB
    56s sys_mem:360.54 MB, objspace_mem:322.96 MB
    1m  sys_mem:360.54 MB, objspace_mem:322.96 MB
    1m3s    sys_mem:360.54 MB, objspace_mem:322.96 MB
    1m7s    sys_mem:360.54 MB, objspace_mem:322.96 MB
    1m10s   sys_mem:360.54 MB, objspace_mem:322.96 MB
    set string&object to nil, and sleep 30 min to check the memory usage.
    1m13s   sys_mem:304.78 MB, objspace_mem:3.46 MB
    1m16s   sys_mem:304.78 MB, objspace_mem:3.46 MB
    1m19s   sys_mem:304.78 MB, objspace_mem:3.46 MB
    1m22s   sys_mem:304.78 MB, objspace_mem:3.46 MB
    

    几秒钟就释放干净了。你的启动参数是怎样的?

  • 统计的时候能不能跑一下 GC.stat,这样看不出来是哪里的内存。

  • 矩阵运算并不是 Python 语言的特性啊。。。主要是 Ruby 在这类语法糖的问题上处理非常宽松,经常一个方法一堆 alias,这 Python 吧。。。

  • 突然就明白我为什么通过不了 Ruby Certificate 考试了

    • 为什么函数式命令 reduce 被 Python 3 移到 functools,迫使每次使用的时候都要 import 一下呢?
    • 因为 Guido 不喜欢