最近我进行了这样的实验-新对象不停地不断循环生成而不保存它们的任何引用,因此它们应该在最合适的时刻被垃圾收集器销毁。唯一的特别之处是,对象在内存使用方面非常大-一个对象包含7000万个元素的数组。这是代码:
class Temp {
private $data;
function __construct() {
$this->data = range(1,70000000);
}
}
while (true) {
new Temp();
}
我很惊讶在内存使用情况图中没有任何垃圾收集器的锯齿状典型行为。就是这里(数组中有7000万个元素):
问题是-sawtooth在哪里?
我最好的猜测是对象的分配和收集过程开始并发工作,或者其他事情正在发生。
编辑1:
当数组中的元素数减少到6000万时-我得到 锯齿GC行为符合预期(阵列中有6000万个元素):
编辑2:
如果数组中的元素数量增加(数组中的9000万个元素),我将得到一个反向的锯齿图! :
所以似乎有7,000万个元素测试是这两种不同形状的锯齿之间的边缘情况。但是我不清楚其背后的原因。