2017-01-14 6 views
1

거대한 angular.js/node 앱을 NW.js로 포팅합니다. 앱의 메모리 사용량을 확인할 때까지는 아무 문제가 없었습니다. 앱이 시작되면 nwjs Helper 프로세스가 75MB를 소비했습니다. 처음 다시로드 한 후 location.reload() 또는 win.reload()을 사용하면 메모리 사용량이 110MB까지 증가했습니다. 두 번째 재로드, 125MB. 세 번째 다시로드, 155MB, 네 번째 다시로드, 180MB. 다섯 번째 다시로드, 205 MB, 여섯 번째 다시로드 235 MB ... 등등. 20 또는 25 재로드시 앱이 다운되었습니다. 응용 프로그램은 재로드시 30MB의 메모리 사용량을 유지하는 하위 노드 프로세스를 사용합니다. 노드와 크롬간에 공유되는 컨텍스트가 없으므로 노드와 크롬 프로세스 간의 모든 통신은 localStorage를 사용하여 수행됩니다. Chrome에서 웹 앱으로 실행되는 동일한 각도 앱에는 메모리 누수가없고 각 다시로드 할 때 메모리가 0부터 시작됩니다.NW.js에서 새로 고침시 모든 메모리 플러시

chrome.runtime.reload()을 사용하여 부분적인 해결책을 찾았지 만 문제는 크롬보기를 새로 고치는 것이 아니라 모든 자식 프로세스를 종료하는 것입니다 (앱을 종료하고 다시 시작하는 것과 같습니다). 기본 뷰를 새로 고칠 때 실행중인 노드 프로세스를 유지해야합니다. 많은 사람들이 크롬 웹뷰에서 페이지를 다른 페이지로 이동할 때 나타나는 메모리 누수와 같은 문제를 가지고있는 포럼을 읽었습니다. 내가 다시로드하기 전에 노드에 의해 모든 메모리 노드를 지우려고 아무 것도 (로버트 CMoses Kałamański에서 블랙 홀 프로그램을 사용하여) 일이. global.gc()을 사용하여 "js-flags": "--expose-gc"과 함께 시도했지만 아무런 문제가 발생하지 않았습니다.

몇 가지 변수로만 간단한 앱을 만들었으며 리로드 할 때 동일한 메모리 누수가 나타납니다. 난 NW.js 데모 애플 리케이션을 시도 (그냥 매개 변수없이 nwjs 실행할 때) 및 nw, 크롬 및 노드 버전 회색 화면이 나타납니다. 이 간단한 페이지에서 오른쪽 클릭 - 응용 프로그램 다시로드를하면 메모리 사용량이 증가합니다 ... OMG !!!!

다시로드 할 때 창을 언로드하기 전에 NW.JS에서 크롬보기의 모든 메모리를 비울 수있는 방법이 있습니까? 모든 자바 스크립트 객체와 DOM 노드를 지우는 안전한 방법이 있습니까? 아니면 NW.js 메모리 관리의 버그입니까?

나는 0.19.4

답변

0

는 DOM에 대한 참조가 노드 컨텍스트에서 개체 없습니다 있는지 확인하십시오 NW.js의 V를 사용하고 있습니다. 노드 컨텍스트는 백그라운드 페이지에 있으며 응용 프로그램 수명 기간 동안 계속 실행됩니다. 그렇게하기 위해 devtools에서 힙 프로파일 러를 사용하여 참조 할 객체를 찾습니다.

또 다른 방법은 노드 컨텍스트와 DOM 컨텍스트가 동일한 "혼합 컨텍스트"모드를 사용하는 것입니다.

더 자세히보기 : http://docs.nwjs.io/en/latest/For%20Users/Advanced/JavaScript%20Contexts%20in%20NW.js/

+0

결과없이 언급 한 모든 것을 시도했습니다. 내가 게시 한 것처럼 노드에 액세스하지 않고 아주 쉽게 응용 프로그램을 다시로드하면 각 다시로드 할 때마다 메모리가 증가합니다. nwjs의 방문 페이지를 사용해 보면이 같은 오류가 발생합니다. –

+0

SDK를 사용하거나 사용하지 않은 상태에서 nw.js 0.19.5에서 테스트 한 경우 동일한 문제가 발생합니다 ... –

+0

로저, 정말로 감사드립니다. 또한 뉴스를 읽지 않고서도이 문제를 조사하는 팀원 2 명도 있습니다. 해결책을 찾지 못하면 전자로 이동해야합니다 (맛은 아니지만이 메모리 누출 문제가없는 한 조사했습니다. 포럼에서). 이 응용 프로그램은 각도 js 1.5를 기반으로하며 코드가 매우 큽니다 (레스토랑 앱은 300 개 이상의 레스토랑에서 Toteat을 사용합니다). 응용 프로그램은 포트 80에서 http 요청을 수신하고 노드 8080에서 소켓 프로세스를 수신합니다. 모든 통신은 localStorage를 통해 이루어지며 데이터는 websql에 저장됩니다. –