2012-01-13 3 views
8

나는 다음 코드를 사용하여 메모리 누수보고 있어요 : 나는 문자열을 정의하고 단지 상수를 사용하여 시도했다node.js 파일의 메모리 누출?

while (true) { 
    console.log("Testing."); 
} 

을,하지만 여전히 메모리 누수 :

var test = "Testing."; 
while (true) { 
    console.log(test); 
} 

같은 누출을 표준 로그 대신 파일을 사용하는 경우 발생합니다.

var test = "Testing."; 
var fh = fs.createWriteStream("test.out", {flags: "a"}); 
while (true) { 
    fh.write(test); 
} 

파일을 제대로 닫지 않았기 때문에 내가 생각한 것일 수도 있지만 까지 누출을 보았다 :

var test = "Testing"; 
while (true) { 
    var fh = fs.createWriteStream("test.out", {flags: "a"}); 
    fh.end(test); 
    fh.destroy(); 
    fh = null; 
} 

사람이 내가 메모리가 누수없이 일을 쓰기로되어있어 방법에 대한 힌트가 있습니까?

답변

10

노드에 "쓰기 성공"이벤트를 처리 할 기회가 주어지지 않으므로 이러한 현상이 발생합니다. 노드에게 이벤트를 처리 할 수있는 기회를주기 위해 이벤트 루프가 수시로 반복을 수행하도록해야합니다. 이 누출되지 않습니다 : 당신은 거의 한 번이 문제가에서 데이터의 너무 많은 양을 쓸 필요가 없습니다 때문에

실제 사용 사례에서
function newLine() { 
    console.log("Testing."); 
    process.nextTick(newLine); 
} 
newLine(); 

이 아무 문제가 없다. 이벤트가 발생하면 이벤트 루프를 수시로 순환 시키십시오.

트릭에도 이와 관련된 두 번째 문제가 있습니다. 쓰기가 비동기이며 콘솔/파일/노드가 노드보다 느린 경우 노드는 출력이 다시 사용 가능할 때까지 데이터를 끝없이 버퍼링합니다. 이것을 피하려면, 어떤 물건을 쓰고 난 후에 drain 이벤트를 청취해야합니다. 파이프가 다시 사용 가능할 때 알려줍니다. 참조 : http://nodejs.org/docs/latest/api/streams.html#event_drain_

+0

파일 처리기 ('fs.createWriteStream')로 솔루션을 재현 할 수 있었지만'console.log'로 시도해도 여전히 메모리 누수가 발생합니다. 'function writeConsole() {console.log ("test"); if (typeof (gc) == "function") gc(); process.nextTick (writeConsole); } writeConsole();' 위의 코드 블록을'node test.js'와 함께 실행하면 모든 반복마다 내 메모리 사용 풍선이 보입니다. 'node --expose-gc test.js'로 실행할 때, 나는 상수 증가가 보이지 않습니다. – facetious

+0

@facetious : GC 사이클을 너무 자주 수행하지 않으면 비효율적입니다. 잠시 동안 실행하면 메모리 사용량이 결국 시작 레벨로 떨어지는 것을 확인할 수 있습니다. – thejh

+0

@facetious : 나는 심지어 그 자신을 실험 해 보았습니다. gnuplot을 사용하여 메모리 사용량 그래프를 만들었습니다. 올바르게 기억한다면, 항상 더 많은 시간을 얻은 다음 대략 시작 값으로 떨어졌습니다. – thejh