2015-07-09 23 views
5

Tôi gặp sự cố với sự cố rò rỉ bộ nhớ trong khi xuất một số lượng lớn tệp từ mảng đối tượng. đang Giản trông như thế này:PHP: Mảng đối tượng và rò rỉ bộ nhớ

class Test_Class 
{ 
    private $a = null; 

    public function __construct($a = null) 
    { 
     $this->a = $a; 
    } 

    public function __destruct() 
    { 
     unset($this->a); 
    } 
} 

print 'Memory before: '.memory_get_usage(1).' <br>'; // 262 144 
$a = []; 
for ($i=0; $i<600000; $i++) 
    $a[] = new Test_Class($i); 

print 'Memory after create: '.memory_get_usage(1).' <br>'; // 129 761 280 

for($i=0; $i < count($a); $i++) 
    unset($a[$i]); 

unset($a); 

print 'Memory after: '.memory_get_usage(1).' <br>'; // 35 389 440 

tại một trong những lần lặp tiếp theo bộ nhớ vẫn kết thúc. Bất kỳ ý tưởng nào về cách giải phóng bộ nhớ bị chiếm đóng?

P.S. Tôi thử unset()/assignment null và gc_collect_cycles(), không có phương thức nào cho phép tôi giải phóng bộ nhớ bị chiếm bởi mảng đối tượng

+1

có thể trùng lặp của [Cách tốt nhất để tiêu diệt đối tượng PHP?] (Http://stackoverflow.com/questions/8798443/best-way-to-destroy-php-object) – FrankerZ

Trả lời

0

Tôi không nghĩ đây là rò rỉ bộ nhớ. Bộ nhớ là thực sự giải phóng và có sẵn, nó chỉ có vẻ như php giữ nó để sử dụng nó và không cung cấp cho nó trở lại hệ thống. Tôi đoán nó có liên quan đến bộ thu gom rác. Nó có vẻ là một hành vi xấu nhưng có lẽ đó là một lý do chính đáng ...

của cô là bằng chứng của tôi: (Bởi vì cấu hình của tôi, tôi đã sử dụng các giá trị nhỏ hơn nhưng hành vi này là như nhau)

/* 
    You class definition 
*/ 

print 'Memory before: '.memory_get_usage(1).' <br>'; // 262 144 
$a = []; 
$b = []; 
for ($i=0; $i<5000; $i++) 
    $a[] = new Test_Class($i); 

print 'Memory after create: '.memory_get_usage(1).' <br>'; // 2 359 296 

for($i=0; $i < count($a); $i++) 
    unset($a[$i]); 

unset($a); 

print 'Memory after unset: '.memory_get_usage(1).' <br>'; // 1 572 864 

for ($i=0; $i<1000; $i++) 
    $b[] = $i; 

print 'Memory after $b: '.memory_get_usage(1).' <br>'; // 1 572 864 

Bạn có thể thấy ở đây rằng việc tạo ra $b không cần thêm bộ nhớ nữa. Điều này là lạ vì một mảng cần bộ nhớ khi bạn không làm bất cứ điều gì trước đây:

$b = []; 

print 'Memory before: '.memory_get_usage(1).' <br>'; // 262 144 

for ($i=0; $i<1000; $i++) 
    $b[] = $i; 

print 'Memory after: '.memory_get_usage(1).' <br>'; // 524 288 

Đó là lý do tại sao tôi nghĩ bộ nhớ được giải phóng nhưng php chỉ nằm trên đó.