이제이 문제에 대해 2 주 동안 검색 중이며 웹에서 검색하는 것만으로는 찾을 수없는 것 같습니다.스레드에서의 Perl 메모리 누수 (스레드가 메모리를 해제하지 않음)
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 루프로 해제되지 않은 모든 메모리가 절대로 운영 체제로 다시 릴리스되지 않습니다.
누구에게도 동일한 문제가 발생합니까?
펄 : 데비안 6.0.5
덕분에 많은
편집 : 1 : 내가 사용 x86_64에-리눅스 스레드 멀티에 대한
OS 내장 (v5.16.1) 800 개의 스레드와 모두 $ ee var 인쇄하여 종료 확인할.
하지만 while (1) 루프에 들어가면 여기에 ps aux | grep perl 출력 :
[email protected]:~# 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 : 나는 내 문제를 해결
, 내 구조를 변경했습니다. 실제로 주 프로그램 (장기 실행 프로그램)은 분리되어 있으며 모든 스레드가 종료되기 전에 기다리는 작은 프로그램을 사용합니다.
이렇게하면 가상 메모리가 가득 차고 다른 데몬은 죽지 않습니다.
나를 솔루션으로 안내하는 모든 분들께 감사드립니다.
OS X 10.8/Perl 5.16.0에서 사용해 보았습니다. 첫 번째로 보는 동작은 약 6 메가 주민이 수천 스레드 뒤에있는 메모리 사용 수준입니다. 두 번째 단계는 거의 같은 수준에서 벗어나 수면 상태를 유지합니다. 스레드 메모리는 분명히 두 경우 모두 릴리스됩니다. 메모리가 공개되지 않는다는 증거를 더 게시 할 수 있습니까? 어쩌면'ps'가 1 초마다 출력 될까요? – Schwern
ps 출력이 추가되었습니다. 실제로 실제 프로그램은 더 복잡하고, 불에 타지 않기 위해 여기에 게시하지는 않았지만 오랜 시간 동안 실행하고 매 시간마다 250에서 900 개의 스레드를 열어 전체 메모리를 전체 메모리의 약 10 %로 풀어 놓지 않습니다. . 그러나 이것은 두 번째 예와 완전히 같습니다. 더 많은 정보가 필요한 경우 알려주십시오. 덕분에 – user1761742
내가 틀렸다고 정정 해 주지만 * 프로세스 *가 종료 될 때 Perl * only * 무료 메모리를 사용하지 않습니까? 이것은 오랫동안 지속 되어온 "기능"이었으며, 최근 perldeltas에서 스레딩과 관련된 최적화의 증거를 찾을 수 없었습니다. 나는 당신이 "누설"보다 목격했다고 주장하는 메모리 사용의 감소 *에 더 놀랐습니다. – amon