首页 > 解决方案 > 为什么内存使用统计中没有锯齿形状?

问题描述

最近我做了这样的实验——新对象不断地在一个不停止的循环中产生,没有保存它们的任何引用,所以它们应该在最近的合适时刻被垃圾收集器销毁。唯一特别的是对象在内存使用方面非常大 - 一个对象包含 7000 万个元素的数组。这是代码:

class Temp {
    private $data;

    function __construct() {
        $this->data = range(1,70000000);
    }
}

while (true) {
    new Temp();
}

我很惊讶在内存使用图中没有任何典型的垃圾收集器行为。这是(数组中的 7000 万个元素):

在此处输入图像描述

问题是 -锯齿在哪里?

我最好的猜测是对象的分配和收集过程开始同时工作,或者其他事情正在发生。

编辑1:

当数组中的元素数量减少到 6000 万时 - 我得到了预期的锯齿 GC 行为(数组中的 6000 万个元素): 在此处输入图像描述

编辑2:

如果数组中的元素数量增加(数组中的 9000 万个元素) - 我会得到一个反向锯齿图!: 在此处输入图像描述

因此,7000 万个元素的测试似乎是这两种不同形状的锯齿之间的一个边缘案例。但我不清楚这背后的原因。

标签: phpgarbage-collection

解决方案


推荐阅读