【问题标题】:memory handling in php vs java [duplicate]php vs java中的内存处理[重复]
【发布时间】:2012-01-01 23:03:45
【问题描述】:

可能重复:
Is there garbage collection in PHP?

在java中有一个叫做Garbage Collector的概念。在 Java 中,当一个对象无法从任何活动线程或任何静态引用访问时,它就符合垃圾回收的条件,换句话说,如果一个对象的所有引用都为空,那么您可以说一个对象符合垃圾回收的条件。

PHP 会发生什么?会不会导致内存溢出。这是PHP 的一个缺点还是有办法处理?PHP 提供了哪些有效处理内存的方法和技术?

【问题讨论】:

  • 现在我才意识到这是一个明显的重复。所以我要投票关闭。

标签: php memory garbage-collection


【解决方案1】:

关于 php 最重要的是,它具有基于引用计数的 GC。见例子:

$a = 8;
unset($a); //memory free

$a = 8;
$b = &$a; //or even $b = $a, see below
unset($a); //memory unchanged

而 php 在更改之前将所有数据相互链接:

$a = 8;
$b = $a; //we use memory only for $a
$b++; //now we use twice more memory

这是脚本语言的好方法,因为您可以在应用程序的不同层之间传输对象(例如,在 MVC 中以 M->C->V 的方式移动数据)而无需考虑指针或内存使用情况。

但是,如果你这样做(来自docs 的示例):

$a = array( 'one' );
$a[] =& $a;

您根本无法清理内存。这是典型的情况,当我们在 MVC 中有一些主要的粘合类 application 时,它存储在每个对象中。在这种情况下,我们将无法clean up 内存。但是,对于生命周期为几毫秒的脚本语言来说,这并不重要。

【讨论】:

  • PHP 5.3 应该能够释放上一个示例中的内存。
  • 谢谢,我会在星期一做一个测试。
  • 抱歉回答晚了,但我现在不使用 php。通过文档浏览。你仍然可以依靠我的回答,afaik。 php引擎内部做了很多工作,但引用计数GC的基本功能保持不变。
【解决方案2】:

PHP 确实有一个垃圾收集器,但在 PHP 5.3(5.2?)之前,它无法处理循环引用并且无法 GC 某些构造。例如

$a = &$a;

会导致内存泄漏。除非必须,否则 PHP 不会运行 GC,因为 GC 运行成本很高,而且通常不需要,因为大多数 PHP 脚本都是短暂的。 GC 只会在内存压力存在时才会启动,并且只有在根本无法释放足够的内存时才会出现 OOM 错误。

【讨论】:

    【解决方案3】:

    PHP 也进行垃圾收集,事实上,在 PHP 中你很少需要考虑内存。在 PHP 5.3 中,垃圾收集得到了相当大的改进。在PHP manual 中了解它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-08
      • 2013-05-08
      • 2011-06-05
      • 2015-07-27
      相关资源
      最近更新 更多