2010-01-04 4 views
0

이것은 이상한 것입니다. 일종의 게임 인 앱을 만들고 있는데 별똥별을 일으키고 싶었습니다. 어느 날 저녁에 만들었고 브라우저가 300 메가 이상의 램을 먹고 5 초마다 1 메가를 먹는 것을 보았을 때까지 모든 것이 잘 돌아갔습니다. 주로 스타 버스트가 발생할 때가있었습니다. http://www.sizzln.com/example.htm브라우저에서만 발생하는 Silverlight 메모리 누수를 추적하려고 시도합니다.

먼저 생각 나는 개체를 제거하거나 아직 어딘가에 참조를 가지고 있지 않다 : 여기

은 항성에 벗었 예입니다. 생성 된 각 별을 캔버스에 넣을 예정이지만 3 초마다 이전 시작을 제거합니다. DoubleAnimations도 많이 있지만 콜백을 사용하여 모든 항목을 null로 설정할 수도 있습니다.

여기 WPF로 변환하면 이상한 부분이 있습니다. Silverlight Spy 3에서 실행하면 이 발생합니다.이 발생합니다. WinDbg 및 SOS.dll을 사용하여 힙 덤프를 가져 가면 1.8 - 3MB의 RAM 만 사용해야한다고보고합니다.

GC를 3 초마다 실행하여 정리했지만 아무런 효과가 없습니다. heapdump에서 많은 객체가 삭제 된 것을 볼 수 있습니다. GC 후 1.8 메가 정도로 돌아 왔지만 작업 관리자에 표시된 메모리는 계속 올라갑니다.

무엇을 해야할지 모르겠다. 힙이 정직하지 않은 한 조심스럽게 객체를 제거하고 있다고 생각한다.

+0

다음은 출처입니다. http://www.sizzln.com/example.zip 위의 내용을 새 것으로 추가 할 수 없습니다. ( –

+0

어떤 OS를 사용하고 있습니까? 작업 관리자는 XP와 매우 다릅니다. Vista 7에서 우승 –

+0

Windows 7 64 비트에서 실행 중 –

답변

0

Vista 또는 Win7을 실행하고 있습니까? 운영 체제가 메모리를 회수하지 않는 것처럼 들리지만, shouldn't unless it needs to입니다.
Silverlight GC는 메모리를 곧 다시 할당해야 할 수도 있다는 가정하에 버퍼를 해제하지 않을 수도 있습니다.

두 경우 모두, GC가 실행 된 후에 프로그램이 1.8MB 만 사용한다고 프로파일러가 말한 한 걱정할 것은 없습니다.

+0

Windows 7 64 bit –

0

간단히 코드를 살펴 보았습니다. 이벤트 (+ =)에 연결하는 장소가 많지만 결코 언 후크 (- =)되지는 않습니다. 이들은 하드 참조이므로 궁극적으로 루트 객체에 연결된 경우 수집되지 않습니다.

+0

큰 타이머 생성을 완전히 제거했습니다. 스토리 보드 생성과 관련이 있다고 생각합니다. –

0

좋아요. 나 자신의 질문에 대답을 할거예요. Silveright는 편리한 "BeginAnimation"메서드가 없으므로 기본적으로 동일한 작업을 수행하는 확장명을 추가하는 빠른 방법을 찾았습니다. 스토리 보드를 만들고 시작하여이를 수행했습니다.

그러나 그곳에 머물러 있었지만 정확히 어떤 것이 연결되어 있는지도 모릅니다. 그것이 끝나면 Stop()을 호출하면 내 기억 문제가 해결되었습니다.

하나의 이상한 부작용은 stop 메서드를 호출 할 때 조심해야합니다. 너무 많은 스토리 보드를 만들면 조금 혼란스러워 보였으므로 제거 된 후에도 일부 개체가 다시 나타납니다. 제어.

관련 문제