2013년 1월 7일 월요일

효과적인 C# 메모리 관리 방법

마이크로소프트웨어 효과적인 c#메모리관리기법

말 그대로 효과적인 C#메모리 관리 방법에대해 알아본다.
1. '+' operator를 통한 문자열 조합
위의 문제는 가비지가 많이 발생한다. '+' 연산자로 두값을 연결할때마다
새로운 string 인스턴스가 생성된다. 연이어 + 연산자가 나오기 때문에
또 string인스턴스가 생성되고 이전에 만들어진 string인스턴스는 가비지가 된다.
=> StringBuilder객체를 생성하여 사용하자

2. 메소드 안에서 생성한 객체
C#은 c++과달리 클래스를 인스턴스하려면 반드시 new를 해줘야한다. (이때 Heap에 메모리할당)
특정 메소드안에서 new로 생성된 인스턴스는 메소드를 빠져나오면 더 이상 사용하지 않게 돼
가비지로 처리된다. 이러한 패턴의 메소드가 자주 호출될수록 가비지도 많이 발생된다.
=> 클래스를 구조체로 바꿔보면 new연산자로 인스턴스를 만들어도 Heap영역에 메모리가
할당되지 않는다 구조체 역시 Value Type이기 때문에 Stack영역에 할당되며 메소드를 빠져나갈경우
자동으로 삭제된다. Heap영역이 아니므로 가비지컬렉션의 대상이 되지않는다.
구조체도 싫다면 맴버변수로 사용한다.


3. 속도 저하가 큰 Boxing
Boxing이란 Value Type객체를 Reference Type객체로 포장하는 과정을 뜼함
c#의 모든 객체는 object로 상속되는데 심지어 상속받지 못하는
int, float등의 Value Type조차도 object로부터 상속된것처럼 사용할수 이싸ㄸ.
하지만 가비지 컬렉션에의한 부하 못지않게 Boxing으로 인한 부하도 크다.

=> 다양한 Type을 처리하는 경우가 아니라면 Collections에 사용된 값의 type을 명시해
주는 Generic Collection 사용을 권한다...
List List 이런것.?
즉 되도록 Boxing과 UnBoxing을 최소화하라는 의미.. Effective C# 정리에서 Boxing, UnBoxing 내용


4. WeakReference로 의도하지 않은 참조를 없애보자
인스턴스를 참조 하는 모듈에서 WeakReference를 사용하면 의도하지 않은 참조로
메모리가 해제되지 않는 실수를 방지할수 있다. 주의할점은 WeakReference.Target값을
보관하면 안된다는것, 만약 보관하고있다면 강한참조(Strong Reference)가 일어나 이를 인식한
가비지컬렉터는 회수를 실행하지 않는다.

5. GC 가비지 컬렉션처럼 원하는 시점에 없애고 싶다면... IDisposal
.IDisposal 인터페이스를 구현한 클래스를 생성하고 Dispose()메소드 내에서 리소스를해제!

댓글 없음:

댓글 쓰기