2012-07-08 2 views
0

Silverlight에서 사용자 지정 텍스트 상자 컨트롤에 대해 여러 실행 취소/다시 실행 시스템을 작성하고 있습니다. 내가 지금하고있는 일은 메모리 소비를 줄이는 것이다.일반 스택을 사용한 가비지 수집

그래서 내가 가지고있는 문제는 내가 사용하고있는 스택이 너무 오래 메모리에 저장되어 있다는 것입니다.

Count이 자연스럽게 0에 도달하거나 이벤트로 인해 스택이 지워질 때마다 스택을 모두 지우는 것이 상대적으로 저렴할 것입니다. 그래서 나는 그것을 기대하고,이 코드를 그렇게하려고 해요합니다 ... GC에 의해

TextHistory.Clear() 
TextHistory = Nothing 

을 집어됩니다하지만 확실히 작동하지 않습니다,이 스택은 잠재적으로 50메가바이트 이상을 보유 할 수 있습니다. 그런데 TextHistoryStack(Of Moment)입니다. 그리고 여기 (T의)를 Moment 클래스 ...

Public Class Moment 
    Public Text As String 
    Public SelectionStart As Integer 
    Public SelectionLength As Integer 

    Public Sub New(ByRef _Text As String, _SelectionStart As Integer, _SelectionLength As Integer) 
     Text = _Text 
     SelectionStart = _SelectionStart 
     SelectionLength = _SelectionLength 
    End Sub 
End Class 
+0

* * 작동합니다. 당신이 우리에게 문제를 일으키고 있다고 말하지 않은 것이 있습니다. GC가 즉시 발생하지 않는다는 것을 알고 있습니까? – usr

+0

TextHistory 스택 또는 다른 Moment 객체에 대한 참조를 다른 곳에 보관하지 않는다고 가정하는 것이 안전할까요? – roken

+0

@usr - GC가 즉시 발생하지 않는다는 것을 알고 있지만 GC.GetTotalMemory()와 전체 Silverlight 프로세스의 실제 메모리 사용량을 모두보고 있으며 몇 분 동안 모든 메모리를 보유하고 있습니다. (아마 영원히). 그런 다음 TextHistory 스택에 푸시하는 선을 주석 처리하고 동일한 작업을 수행 할 때 메모리 사용량이 2MB 또는 3MB 증가합니다 (50 회는 반대). –

답변

1

GC에서 강제로 작동한다고 (작업 = 쓰레기 정리). 이것이 작동하는 방식입니다.

GC가 필요에 따라 발생합니다. 수요는 많은 할당이 발생했거나, 메모리 압박 또는 수동 트리거입니다. 이런 일들이 일어나서 쓰레기가 정화되지 않았습니다.

GC는 시간 기반으로 실행되지 않습니다 (매분마다).

+0

감사합니다. GC가이 문자열에 사용 된 메모리를 조금 더 빨리 정리하도록 권장 할 수 있다고 생각했습니다. 그러나 이것은 합리적입니다. 사실, 전체 알고리즘을보다 효율적으로 만들면 큰 문제가되지 않을 것입니다. –

+0

귀하의 경우에는 특별한 경우에 GC를 강제 실행하는 데는 아무런 문제가 없습니다. – usr

2

스택은 T 배열을 사용하여 구현합니다. 50MB에서이 어레이는 2 세대에서만 수집되는 대형 오브젝트 힙에 여러 번 복사되고 확장됩니다. 대형 오브젝트 힙은 압축되지 않으므로 어레이 사본에 대해 추가 공간이 할당되면 해당 공간은 할당 된 채로 유지됩니다 어레이가 GC에 의해 수집 된 후 "구멍"이 다른 객체에 대해 사용 가능할 것입니다.

스택이 실제로 커질 필요가있는 경우 링크 된 목록을 통해 스택을 구현하여 대형 오브젝트 힙을 사용할 수 있습니다.

+0

그렇습니다 당신은 내가 저장하고있는 것의 관점에서 (만약 내가 작업중 인) 실행 취소 시스템을보다 효율적으로 만들면 가비지 컬렉터가 더 나은 결과를 처리 할 것이라고 말하고 있습니다. 말하자면 역사상 전체 스냅 샷을 나타내는 전체 '텍스트'값을 저장하기 때문에 지금은 비효율적입니다. 나는 메모리 소비를 대폭적으로 돕는'SelectedText' 값만을 저장하도록 이것을 바꿀 것입니다. –

+0

@SteveWortham 제 생각에 스택이 50MB로 커지면 엄청난 순간이 있습니다. (그런데 어떻게이 숫자를 얻었습니까?). 가장 좋은 방법은 메모리 프로파일 러를 잡아서 메모리 사용이 어떻게 생겼는지에 대한 진정한 그림을 얻는 것입니다.훌륭한 도구 인 IMG (Red Gate)에서 ANTS에 대한 무료 평가판을 얻을 수 있습니다. – roken

+0

@SteveWortham 또한 Moment 객체가 참조하는 문자열의 크기가 내 대답의 explination에 포함되지 않는다는 점에 유의할 가치가 있습니다. 문자열 자체는 LOM에서 Moment 객체의 일부로 존재하지 않기 때문에 간단히 참조됩니다. – roken