Bug #77209 [Com]: Leaks memory

From: Date: Tue, 27 Nov 2018 14:05:04 +0000
Subject: Bug #77209 [Com]: Leaks memory
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-218165@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=77209&edit=1 ID: 77209 Comment by: silicid at gmailc dot om Reported by: silicid at gmail dot com Summary: Leaks memory Status: Feedback Type: Bug Package: Performance problem Operating System: Debian 8 PHP Version: 7.2.12 Block user comment: N Private report: N New Comment: It depends on the number of objects created. The output for me is: int(37336) int(3733600) int(0) int(3808384) int(3733600) int(0) int(7579320) int(3733600) int(0) int(11350256) int(3733600) int(0) int(15121192) int(3733600) int(0) int(18892128) int(3733600) int(0) int(22663064) int(3733600) int(0) int(26434000) int(3733600) int(0) int(30204936) int(3733600) int(0) int(33975872) int(3733600) int(0)... Previous Comments: ------------------------------------------------------------------------ [2018-11-27 13:39:35] danack@php.net please could you check again, with code like the below as I don't think the garbage collection kicks in immediately every single time, and also if it is actually a memory leak, the memory usage should continue to go up, rather than just be slightly higher for a moment. The output of the script below for me is: int(0) int(0) int(32) int(0) int(0) int(32) int(0) int(0) int(32)... https://3v4l.org/dPZ2R class Test { public function __construct() { for ($i = 0; $i < 1000; ++$i) { $this->result[] = rand(1, 1000); } } function object() { is_object($this); } } function checkMemory($memoryAtStart) { for ($i = 0; $i < 1; ++$i) { $object = new Test(); $object->object(); unset($object); } var_dump(memory_get_usage() - $memoryAtStart); $memoryAtStart = memory_get_usage(); for ($i = 0; $i < 100; ++$i) { $object = new Test(); $object->object(); unset($object); } var_dump(memory_get_usage() - $memoryAtStart); $memoryAtStart = memory_get_usage(); for ($i = 0; $i < 100; ++$i) { $object = new Test(); is_object($object); unset($object); } var_dump(memory_get_usage() - $memoryAtStart); } $memoryAtStart = null; for ($x=0; $x<100; $x++) { if ($memoryAtStart === null) { $memoryAtStart = memory_get_usage(); } checkMemory($memoryAtStart); gc_collect_cycles(); } ------------------------------------------------------------------------ [2018-11-27 13:20:12] silicid at gmailc dot om PHP Version 7.2.12-1+0~20181112102353.11+jessie~1.gbp55f215 System Linux VV10015-z2174 4.15.17-3-pve #1 SMP PVE 4.15.17-13 (Mon, 18 Jun 2018 17:15:04 +0200) x86_64 Build Date Nov 12 2018 13:46:27 ------------------------------------------------------------------------ [2018-11-27 12:09:57] silicid at gmail dot com Description: ------------ You must create a file with the specified code. If you execute method "is_object" from "$this" and unset the object, then leaks memory. But if you call method "is_object" for "$object", then there are no problems. In version 7.1 there are no problems. There are no problems in Windows. Test script: --------------- <?php class Test { public function __construct() { for ($i = 0; $i < 1000; ++$i) { $this->result[] = rand(1, 1000); } } function object() { is_object($this); } } $memory = memory_get_usage(); for ($i = 0; $i < 1; ++$i) { $object = new Test(); $object->object(); unset($object); } var_dump(memory_get_usage() - $memory); $memory = memory_get_usage(); for ($i = 0; $i < 100; ++$i) { $object = new Test(); $object->object(); unset($object); } var_dump(memory_get_usage() - $memory); $memory = memory_get_usage(); for ($i = 0; $i < 100; ++$i) { $object = new Test(); is_object($object); unset($object); } var_dump(memory_get_usage() - $memory); Expected result: ---------------- int(0) int(0) int(0) Actual result: -------------- int(37336) int(3733600) int(0) ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=77209&edit=1

« previous php.bugs (#218165) next »