[英]Perl memory leak in threads (threads don't release memory)
我現在正在搜索有關該問題的兩個星期,似乎僅在網絡上搜索就找不到任何答案。
因此,這是兩段代碼:
1:
#! /usr/bin/perl
#
# RELEASE MEMORY
#
use threads;
my @child;
$ii=0;
while (1)
{
my @child = threads->new(\&test, "test");
$_->detach for @child;
print "$ii\n";
$ii++;
}
sub test {
my ($ee) = 0;
}
2:
#! /usr/bin/perl
#
# DO NOT RELEASE MEMORY
#
use threads;
my @child;
$ii=0;
for($ii=0;$ii<2000;$ii++) {
my @child = threads->new(\&test, "test");
$_->detach for @child;
print "$ii\n";
}
while(1)
{
sleep(10);
}
sub test {
my ($ee) = 0;
}
這就是問題所在。 第一個代碼僅運行一個無限循環,並且大約每2秒將其釋放回操作系統(根據ps)
第二個代碼也釋放內存,但僅當他在“ for”循環中運行時才釋放內存。 一旦退出for循環並進入無限循環,所有尚未釋放到for循環中的內存就永遠不會釋放回操作系統。
是否有人遇到過同樣的問題?
Perl:(v5.16.1)為x86_64-linux-thread-multi構建
操作系統:Debian 6.0.5
非常感謝
編輯1:我使用了800個線程,並且所有線程都通過打印$ ee var來驗證它們是否退出。
但是一旦進入while(1)循環,這就是ps aux | grep perl輸出:
root@srv:~# ps aux | grep perl
root 6807 41.5 2.5 387780 209580 pts/0 S+ 16:38 0:02 /opt/ActivePerl-5.16/bin/perl /home/tttlast.pl
root 7627 0.0 0.0 7548 856 pts/1 S+ 16:38 0:00 grep perl
因此所有線程都退出了,但是內存使用率仍然是服務器總內存的2.5%。 因此,除非我終止該程序,否則內存仍在使用中。
編輯2:
我解決了問題,改變了結構。 實際上,主程序(長時間運行的程序)已被分離,我使用的是小程序,它們等待所有線程退出。
這樣,它不會充滿虛擬內存,其他守護程序也不會被殺死。
感謝每個人將我引向該解決方案。
這里沒有“問題”。 這是所有正常的預期行為。 如果這導致您遇到某種問題,則無需說明它是什么。
沒有必要將虛擬內存返回操作系統,因為虛擬內存不是稀缺資源。 沒有理由將物理內存返回給操作系統,因為如果操作系統對內存有更好的利用,它將占用它。
沒有證據表明這是內存泄漏。 測試結果表明,在任何情況下都不會出現內存使用無限增加的情況-在所有情況下,內存使用情況最終都會趨於平穩。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.