1

단일 맵에 4 가지 유형의 아이콘이 있습니다. 현재 슬라이드 쇼는 각 유형별로 회전하여 다른 유형을 숨 깁니다. 서로 다른 유형의 마커에 대한 MarkerClusterer 객체가있어 클러스터되지 않습니다.MarkerClusterer 클러스터를 숨길 때의 메모리 누수

내가 겪고있는 문제는 크롬의 힙 스냅 샷이 5 분마다 약 2MB의 메모리 사용량을 증가시키고 있음을 보여줍니다.

function transitionMarkers() { 
    if (isSlideShowActive) { 
     for (var i = 0; i < markers.length; i++) { 
      if (nutrientsArray[slideShowCounter] === markers[i].address.SOURCE_GROUP) { 
       markers[i].setVisible(true); 
      } else { 
       markers[i].setVisible(false); 
      } 
     } 
     for (var n in types.NUTRIENTS) { 
      for (var sc in types.SOURCE_CODES) { 
       if (nutrientsArray[slideShowCounter] === n) { 
        markerClusters[n][sc].setMap(map); 
       } else { 
        markerClusters[n][sc].setMap(null); 
       } 
      } 
     } 
    } 
    incrementSlideShowCounter(); 
} 

마커가 자신의 가시성을 변경하는 기능을 가지고, 그들이 분 이내에 다시 렌더링되기 때문에, 내가 그들에 대해 setMap (널)를 사용하여 귀찮게하지 않는이 현재 나의 코드입니다. 그러나 마커 클러스터에는이 옵션이 없습니다. 내가 힙의 스냅 샷을 검사 할 때, 나는 다음과 같이 수천 개의 개체 참조 :

[1076] :: PF 5 (360) 2451465 @ % 2 3,360%을
2,273,271이 120 % 170 5,441% @ B : GI
E :: 함수() 2,454,527 6 360% 2 3,000퍼센트 @
프로토 : PF 2,338,839 5 120 % 3백60퍼센트
D : 67,519

수천있다 마치 @ "한 bounds_changed"@ 이 bounds_changed 이벤트가 누적되어 앉아있는 중 ... 내지도는 마커 만 숨기거나 표시하며 주변을 돌아 다니거나 확대/축소하지 않습니다. 안으로 또는 밖으로, 또는 그런 것.

의견이 있으십니까?

답변

1

bounds_changed -events는 ClusterIcon이 추가 될 때지도에 바인딩됩니다 (에 전화 할 때마다 항상 발생).

당신이 ClusterIcons가 제거됩니다 markerClusters[n][sc].setMap(null) 전화

는 onRemove-방법은 또한 ClusterIcon -instances에 바인딩 된 모든 청취자를 삭제하지만지도에 바인딩 bounds_changed - 이벤트를 제거하지 않는 onRemove-방법은 (당신은 그것을 호출 할 수 있습니다 버그).

독자적으로 버그를 수정하고 markerslusterer.js를 수정하여 bounds_changed-event도 제거하거나 setMap()을 전혀 호출하지 않아도됩니다. ClusterIcon -instances의 show() 또는 hide() 메서드를 호출하여 표시하거나 숨 깁니다 (더 나은 성능을 제공해야 함).