>

가비지 수집은 JavaScript의 약점이지만, 가능한 한 최선을 다하고 싶습니다.

remote 를 사용하여렌더러프로세스에서 새 창을 만들고 있습니다   main 와는 반대로  프로세스가 더 복잡해 졌다고 생각합니다. 이것이 중대한 문제라면main프로세스에서 생성하는 것이 좋습니다.

지금 창을 만드는 방법은 다음과 같습니다.

import { remote } from 'electron';
function openInternalImageViewer(url) {
  let imgViewer = new remote.BrowserWindow()
  imgViewer.loadURL(url);
}

간단히 imgViewer 를 설정하는 것입니다   null 에 변수  제공된 API를 통해 창을 닫은 후 내 목표를 달성하기에 충분합니까? 아니면 더 정확해야하는 의혹이 있습니까?


  • 답변 # 1

    JavaScript 객체가 메모리에서 제거되었는지 직접 확인할 수는 없습니다. 더 이상 필요하지 않은 모든 참조를 제거하면 가비지 수집기가 작업을 수행 할 수 있습니다. (필자는 수동 메모리 관리를 수행하는 것과 비교할 때 "약점"이라고 부르지 않을 것입니다. JavaScript는 모든 기능을 지원하는 JavaScript의 강점입니다.)

    함수-지역 변수에 대해 걱정할 필요가 없습니다. 함수가 반환되면 변수는 범위를 벗어납니다. 아무것도 수행하지 않기 직전에 수동으로 "지우기". 예 :

    function openInternalImageViewer(url) {
      let imgViewer = new remote.BrowserWindow()
      imgViewer.loadURL(url);
      /* ...let user interact with imgViewer... */
      imgViewer = null;  // Useless assignment.
    }
    
    

    이것은 모두 let 에 해당됩니다.  그리고 var  변수.

    물론글로벌변수는 다릅니다 (물론 이것들은 많지 않아야합니다) :

    var imgViewer;
    (function openInternalImageViewer(url) {
      imgViewer = new remote.BrowserWindow()
      imgViewer.loadURL(url);
    })(some_url);
    /* ...let user interact with imgViewer... */
    imgViewer = null;  // This cleanup makes sense!
    /* program execution continues, imgViewer no longer needed */
    
    

    엔진의 관점에서 null 할당 여부는 중요하지 않습니다 undefined 또는 123 귀하에게 가장 적합한 값을 선택할 수 있습니다.

    또한, 무언가를 생성/할당하는 위치에는 차이가 없습니다. 가비지 수집의 중요한 점은 객체에 "도달 할 수 없는지"여부입니다. 즉, 코드가 다시 도달 할 수있는 방법이 없습니다.

    작동하는지 확인하려면 일종의 메모리 분석/프로파일 링 도구를 사용해야합니다. 가장 간단한 형태는 운영 체제의 작업 관리자를 사용하는 것입니다. 대략 다음과 같은 테스트를 작성하십시오.

    for (var i = 0; i < 100; i++) {
      openWindow();
      closeWindow();
    }
    
    
    모든 관련 프로세스의 메모리 소비가 원래 값으로 계속 돌아가는지 확인하십시오. 아마도 즉시 그렇게하지는 않을 것입니다. 대신 GC가 시작되고 다시 내려올 때까지 메모리가 계속 커지는 "톱니"패턴이 나타납니다. 테스트에서 수동으로 GC주기를 강제로 고려할 수 있습니다. 자동 GC 동작은 가비지 수집에 소비되는 시간과 사용 가능한 메모리의 균형을 맞추기 위해 휴리스틱을 매우 신중하게 조정했기 때문에 프로덕션 코드에서는 시간 낭비라는 점을 명심하십시오.

  • 이전 swift - CFStringself의 의미는 무엇입니까?
  • 다음 php - 내 번호로 Nexmo 전달 메시지