C# 메모리 관리(10)

정적 변수 주의class Counter {
  private static int s_Number = 0;
  public static int GetNextNumber () {
    int newNumber = s_Number;
    // DO SOME STUFF
    s_Number = newNumber + 1;
    return newNumber;
  }
}

GetNext Number () 방법을 동시에 호출하고 new Number에 같은 변수를 sNum 앞.
그러면 두 라인은 동시에 같은 반환값을 얻을 것이다.이 문제를 해결하기 위해서는 일부 코드 블록을 잠그고 경쟁 라인을 대기 대기열에 들어가게 해야 하지만, 이렇게 하면 효율을 떨어뜨릴 수 있다.class Counter {
  private static int s_Number = 0;
  public static int GetNextNumber () {
    lock (typeof(Counter)) {
      int newNumber = s_Number;
      // DO SOME STUFF
      newNumber += 1;
      s_Number = newNumber;
      return newNumber;
    }
  }
}

정적 변수 2 조심하세요.루트에서 인용된 대상은 삭제할 수 없다는 것을 기억하십시오.다음은 코드 세그먼트입니다.class Olympics {
  public static Collection<Runner> TryoutRunners;
}
class Runner {
  private string _fileName;
  private FileStream _fStream;
  public void GetStats () {
    FileInfo fInfo = new FileInfo(_fileName);
    _fStream = _fileName.OpenRead();
  }
}

Collection은 Olympics 클래스를 저장하는 정적 집합이기 때문에 집합 내의 대상은 쓰레기 수거기에서 방출되지 않습니다. (루트에서 간접적으로 인용되기 때문입니다.)그러나 매번 GetStats () 를 실행해서 열린 파일 흐름의 상태를 가져와야 한다는 것을 주의해야 할 수도 있습니다.그것들은 닫힐 수도 없고 쓰레기 수거기에서 방출될 수도 없기 때문에 줄곧 그곳에서 기다렸다.우리가 만약 10만 명의 대상이 존재한다면 프로그램의 성능이 얼마나 나빠질지 상상해 보세요.단품
어떤 방식을 통해 우리는 대상의 실례를 메모리에 영구적으로 유지할 수 있다.우리는 단일 부품 모델을 사용하여 실현한다.
단일 부품은 전역 변수로 볼 수 있으며, 다중 루틴 프로그램에서 많은 골치 아픈 문제와 이상한 행동을 가져올 수 있다.만약 우리가 단일 모드를 사용한다면 우리는 적당한 조정을 진행해야 한다.public class Earth {
   private static Earth _instance = new Earth();
   private Earth() { }
   public static Earth GetInstance() { return _instance; }
}

우리는 개인 구조기를 가지고 있기 때문에 사용자는 정적 GetInstance () 방법으로 Earth 실례를 얻을 수 있습니다.이것은 비교적 고전적인 라인 보안 실현이다. 왜냐하면 CLR은 안전한 정적 변수를 만들 수 있기 때문이다.이것도 c#에서 내가 발견한 가장 우아한 단일 실현 모델이다.
총결산
1. 열린 자원을 남기지 마라!모든 연결을 닫고 모든 비위탁 관리 자원을 정리합니다.using 블록에서 비 트랜잭션 자원을 사용하는 일반적인 규칙
2. 인용을 지나치게 사용하지 마라.우리의 대상이 살아있다면 모든 관련 인용 대상은 회수되지 않을 것이다.인용 클래스의 일부 속성을 조작한 후에 인용 변수를null로 명확하게 설정해야 합니다.쓰레기 수거기가 이 대상들을 회수할 수 있도록 하다.
3. 종결기(finalizer)를 사용하여 작업을 더욱 쉽게 하지만 필수적인 경우.종결기 (finalizer) 는 쓰레기 수거기의 비싼 대가를 치러야 하기 때문에 필요할 때 사용해야 한다.더 좋은 방안은 종결기 (finalizer) 를 대체하기 위해 IDisposible 인터페이스를 사용하는 것이다.이렇게 하면 쓰레기 수거기가 더욱 효율적으로 작동하게 할 것이다.
4. 대상과 그들의 아이를 함께 유지한다.이렇게 하면 쓰레기 수거기는 트랜지스터 더미의 흩어진 메모리를 수집하지 않고 큰 덩어리의 메모리를 만들기 쉽다.따라서 우리가 하나의 대상이 여러 개의 다른 대상에 의해 조합된다고 성명할 때, 우리는 그것들을 좀 긴밀하게 배치해야 한다.

좋은 웹페이지 즐겨찾기