9

가비지 컬렉터의 성능을 향상시키는 데 사용할 수있는 최적화 패턴에는 어떤 종류가 있습니까?가비지 수집 성능을 향상시키는 방법은 무엇입니까?

내가 묻는 이유는 Compact Framework를 사용하는 많은 임베디드 소프트웨어를 사용하기 때문입니다. 느린 장치에서는 가비지 수집이 문제가 될 수 있으며 가비지 수집기가 시작되는 시간을 줄이고 싶을 때 더 빨리 끝내기를 원합니다. 또한 가비지 수집기를 사용하는 대신 가비지 수집기로 작업하면. NET 또는 Java 응용 프로그램, 특히 강력한 웹 응용 프로그램을 향상시키는 데 도움이 될 수 있음을 알 수 있습니다.

여기 내 생각이 있지만 벤치 마크를 수행하지 않았습니다. 일시적 클래스/배열을 재사용

  • (빠른 컬렉션)
  • 이 구조체 대신 클래스
+0

제목을 ".NET Compact frameworok ... 개선"으로 변경하여 검색 결과가 약간의 혼란을 줄 수 있습니다. – cdiggins

답변

12

핵심은 CF GC가 할당을 위해 어떻게 작동하는지 이해하는 것입니다. 이것은 GC를 트리거 할 특정 알고리즘과 수집 후 압축 및/또는 피칭을 일으키는 단순한 마크 앤 스위프, 비 세대 별 GC입니다. 앱 수준에서 GC를 제어 할 수있는 방법은 거의 없습니다 (수집은 사용 가능한 유일한 방법이며, 압축은 어쨌든 강제 할 수 없으므로 사용이 제한적입니다).

개체를 다시 사용하는 것이 좋은 출발이지만 개체 수를 낮게 유지하는 것이 모든 도구 모음 작업에 대해 모든 루트를 이동해야하므로 가장 좋은 도구 중 하나 일 수 있습니다. 그 길이를 짧게 유지하는 것이 좋습니다. 압축이 당신을 죽이는다면, 세그먼트 단편화를 방지하는 것이 도움이 될 것입니다. Objects> 64k는 자체 세그먼트를 얻고 더 작은 오브젝트와 다르게 처리되므로이 점에서 도움이 될 수 있습니다.

CF GC가 실제로 작동하는 방식을 이해하려면 MSDN Webcast on CF memory management을 시청하는 것이 좋습니다.

2

하나를 사용하려고 최소한으로 살아있는 객체의 양을 유지

  • 을 (할당 횟수를 유지) 중요한 사실은 개체의 수명을 가능한 한 짧게 유지하는 것입니다.

  • +1

    필요는 없습니다. 작고 수명이 짧은 오브젝트가 많기 때문에 수명이 긴 몇 개의 대형 오브젝트보다 GC 스 래시가 더 나빠져 실제로 문제가 악화됩니다. 이것은 데스크톱 메모리 및 프로세서 리소스가있는 데스크톱 컴퓨터가 아닙니다. – ctacke

    +0

    MS의 조언은 가능한 한 짧은 수명의 개체를 유지하는 것입니다. 0 세대를 살아남은 객체는 더 문제가됩니다. –

    +0

    이것에 대한 MSDN 기사에 대한 참조가 있습니다. 메모리 생성 당 약 10 배의 속도 저하가 될 것으로 보인다. 이 기사는 http://msdn.microsoft.com/en-us/magazine/dd882521.aspx#id0400035 –

    2

    struct vs class 문제는 복잡한 것입니다 ... lot 더 많은 스택 공간을 사용하면 쉽게 끝날 수 있습니다. 그리고 당신은 확실히 변경 가능한 구조체를 원하지 않습니다. 그러나 다른 점들은 합리적인 것처럼 보입니다. 디자인을 조정하기 위해 모양을 구부리지 않는 한, 현명한 것입니다.

    [편집] 다른 일반적인 gotcha는 문자열 연결입니다. 루프에서 연결을 수행하는 경우 StringBuilder를 사용하면 로트 중간 문자열을 제거합니다. GC가 문자열의 버려진 모든 vesion을 수집하는 중입니다.

    2

    다른 옵션은 GC.Collect()를 사용하여 응용 프로그램에서 피크 시간이 아닌 시간에 수동으로 가비지를 수집하는 것입니다 (CF에서 사용할 수 있다고 가정). 그러면 나중에 응용 프로그램에서 정리에 필요한 객체가 줄어들 수 있습니다.

    0

    Rotor 2.0에 표시되는 것으로 들었습니다. 하드 코어라면 Rotor를 다운로드하고 소스를 조정할 수 있으며 자신 만의 수정 된 가비지 수집기를 사용할 수 있습니다.

    어쨌든 그 포드 캐스트에는 GC에 대한 훌륭한 정보가 있습니다. 나는 그것을 듣는 것이 좋습니다.

    3

    가장 중요한 측면은 할당 속도를 최소화하는 것입니다. 객체가 할당 될 때마다 나중에 GC가 필요합니다. 이제 개체가 또는 인 경우이 만료되면 (GC가 세대를 초월한 경우) 젊은 세대에서 못 박히게됩니다. 대형 물체는 종신 투기장으로 직접가는 경향이 있습니다. 그러나 전혀 모으지 않는 것은 더 좋습니다.

    또한 스택에 물건을 던지면 GC에 대한 부담이 줄어 듭니다. 당신은 GC 옵션을 가지고 놀아 볼 수도 있지만, 할당 프로파일 러를 사용하면 훨씬 도움이 될 것입니다. 그래서 문제를 만드는 부분을 찾을 수 있습니다.

    표준 라이브러리 및 프레임 워크의 중요도는주의해야합니다. 두 개의 객체를 래핑하면 꽤 빨리 채워집니다. GC-heap을 사용할 때마다 일반적으로 GC-bookkeeping을 위해 약간 더 많은 공간을 사용한다는 것을 기억하십시오.따라서 개별적으로 할당 된 1000 개의 포인터는 동일한 포인터의 배열/벡터보다 훨씬 큽니다. 왜냐하면 후자가 GC 부기를 공유 할 수 있기 때문입니다. 반면에, 후자는 아마 훨씬 더 오래 생존 할 것입니다.

    +2

    에서 볼 수 있습니다. CF는 비 세대 별 모델로서 순전히 마크 및 스윕입니다. – ctacke

    관련 문제