메모리 내장 사전을 사용하는 응용 프로그램에 문제가 있습니다 (새 생성자 (bla, fla, pla)를 통해 인스턴스화). 상주 메모리 크기가 ~ 100-150 Mbs에 도달하자마자 마크 컴팩트 단계가 1 초 이상 걸립니다. 백 메그마다 1 초 더 추가됩니다.Node.js GC 마크 - 컴팩트
동작은 다음과 같은 실행하여 재현 할 수 있습니다
node --trace_gc test-memory.js
test_memory.js :
var http = require('http'),
Construct = function() {
this.theField = Math.random();
},
storage = [];
http.createServer(function (req, res) {
var i = 100000;
while (--i) {
storage.push(new Construct());
}
res.end('Lots of data generated.');
}).listen(1337, '127.0.0.1');
그런 다음 컬 로컬 호스트를 수행 얼마 동안 1337 및 시계이 :
Scavenge 143.5 -> 143.5 MB, 2 ms.
Mark-sweep 143.5 -> 143.5 MB, 943 ms.
Mark-compact 143.5 -> 143.5 MB, 1306 ms.
Scavenge 143.5 -> 143.5 MB, 2 ms.
Mark-sweep 143.5 -> 143.5 MB, 937 ms.
Mark-compact 143.5 -> 143.5 MB, 1189 ms.
Scavenge 143.5 -> 143.5 MB, 2 ms.
Mark-sweep 143.5 -> 143.5 MB, 935 ms.
Mark-compact 143.5 -> 143.5 MB, 1191 ms.
Scavenge 143.5 -> 143.5 MB, 1 ms.
Mark-sweep 143.5 -> 143.5 MB, 1015 ms.
Mark-compact 143.5 -> 143.5 MB, 1218 ms.
Scavenge 143.5 -> 143.5 MB, 2 ms.
Mark-sweep 143.5 -> 143.5 MB, 937 ms.
Mark-compact 143.5 -> 143.5 MB, 1195 ms.
GC가 어쨌든 해제되지 않을 객체를 이동하려고 시도 할 때까지 말하면됩니다.
내가 찾은 유일한 해결책은 이러한 객체를 버퍼로 이동하는 것이지만 내 응용 프로그램에서는 JSON.stringify 오버 헤드가 많은 CPU 시간이 될 가능성이 높은 JSON.parse 오버 헤드가 발생합니다. 게다가 상당한 재 작성이 필요합니다.
더 많은 v8 문제가있을 수 있지만 출시되지 않을 개체에 대해 GC를 우회하는 방법이있을 수 있다는 것을 알고 있습니까?
Node.js를 버전은 0.6.11
나는 그렇지 않았지만 내 경우에는 실행 가능하지 않을 것이다. 요컨대 불변의 데이터를 캐시하면 다음과 같이 (즉, 동 기적으로) 내 응용 프로그램을 작성할 수 있습니다 : 'user.item = storage.get ('Item', itemId)' 어떤 종류의 외부 저장소를 사용하면 비동기 방식을 사용합니다. 또한 앱에서 누출이 발견되어 문제가 다소 완화되었습니다. – Prologus