为什么HHVM(zend-compat模式)不释放对象的内存?

时间:2016-05-19 18:46:33

标签: php zend-framework hhvm

PHP扩展中的对象有3个主要处理程序:create,destroy和free。

此处指定了“create”处理程序(请参阅注释“HERE”):

PHP_MINIT_FUNCTION(test2)
{
    zend_class_entry tmp_ce;
    INIT_CLASS_ENTRY(tmp_ce, "Test", test_functions);
    test_ce = zend_register_internal_class(&tmp_ce TSRMLS_CC);

    test_ce->create_object = my_create_handler; // HERE

    memcpy(&test_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
    return SUCCESS;
}

剩余的2个处理程序在my_create_handler

中进行了约束
zend_object_value my_create_handler(zend_class_entry *class_type TSRMLS_DC)
{
    test_object *intern = emalloc(sizeof(test_object));
    memset(intern, 0, sizeof(test_object));

    zend_object_std_init(&intern->std, class_type TSRMLS_CC);
    object_properties_init(&intern->std, class_type);

    retval.handle = zend_objects_store_put(
        intern,
        (zend_objects_store_dtor_t) my_destroy_handler,       // DESTROY
        (zend_objects_free_object_storage_t) my_free_handler, // FREE
         NULL TSRMLS_CC
     );


     retval.handlers = &test_object_handlers;
     return retval;
}   

我为PHP5,PHP7和HHVM构建并运行我的扩展(zend-compat模式)。在我的test.php我做

<?php
    $o = new Test();
    $o->myMethod();
?>

PHP5,7和HHVM之间的区别是:

  • PHP5调用createfree;
  • PHP7调用createdestroyfree
  • HHVM调用create并且内存确实泄漏。

为什么HHVM(使用-m daemon运行)不会调用free?我怀疑它可以使用一些优化,在其他请求中重用已创建的对象,但是在数百万次请求后,对象不断创建。

1 个答案:

答案 0 :(得分:0)

这可能是HHVM中的一个错误。你应该file an issue about it