在PHP中是否有办法找出引用对象的位置,以便找到实际上不再需要的陈旧引用?
一些背景知识:
我正在调试/优化用PHP编写的大型系统,尝试在运行一些大型批处理作业时减少系统的内存占用。
流程基本上是:
1)设置所有处理所需的一些上下文/对象
2)迭代N次操作仅与#1中设置的对象相关的对象,在循环中创建的各个对象之间没有关系/耦合
如果N足够大,系统将永远耗尽内存,即使在步骤#2中创建的每个对象都应该能够在对该特定对象进行处理后进行垃圾回收。
在步骤2中的每次迭代结束时,我正在执行以下操作:
debug_zval_dump($ lObj); echo gc_collect_cycles();
因此我看到了以下结果:
debug_zval_dump:refcount(3) gc_collect_cycles:0
上面让我假设由于某种原因,对系统中某处保留的对象存在一些陈旧的引用,但我只是通过检查代码来找到它们。
任何帮助都非常感谢!
答案 0 :(得分:3)
简短的回答是,你所做的事情是不可能的。从变量中,不可能弄清楚其他变量指向它(嗯,至少不可能从PHP开始)。
我建议设置一个Object Pool。完成后,您将“释放”该对象。这样,池就知道你是否可以重用那个对象(如果有太多的自由对象就扔掉它)。
简而言之,内存管理需要跨多个代码进行协作。如果你在任何一方存储副本,你不能指望它们只是透明地工作。
就debug_zval_dump()
而言,我会非常谨慎地相信它。如果变量是引用,则需要通过引用传递(在5.4+中不能再使用)。因此,如果变量是引用,它将始终为您提供1的引用计数。如果它不是引用,则真正的引用计数将增加1.它在某些边缘情况下很有用,但我不会依赖它适合任何事情......