White Whale Studio

[Effective Coding for Memory] 본문

IT Engineering/C#.net

[Effective Coding for Memory]

glorymind 2016. 8. 11. 09:14
반응형

c#에서는 Garbage Collector가 활동을 하기 때문에 기존의 c, c++보다 메모리 관리가 용이해졌다고합니다.


하지만, 지금까지 경험부족, 실력부족으로 메모리 관리에 대한 필요성을 느껴왔었는데요.


c#에서도 메모리 누수가 충분히 일어날수 있다는 사실을 알고 있기 때문에 가능한 한 이러한 메모리 누수를 줄이기 위한

방법을 해당 포스팅에 정리해보고자 합니다.


------------------------------------------------------


string 작업시에는 "+" 연산자보다는 System.Text.StringBuilder를 사용하자.


개인적으로는 계속 사용하던 연산자라 그런지 + 연산자를 사용하게 되면 매우 쉽습니다. 코딩하기도 편합니다.

그러나 + 연산자를 사용할때마다 새로운 string instance가 생성된다고 하네요.

반면에 stringbuilder를 사용하게 되면 기존에 생성된 instance에 append 하는 방식으로 사용하기 때문에

+ 연산자에 비해 메모리 점유가 줄어들겠죠.

stringbuildler는 이미 선언하여 확보해둔 메모리 공간에 문자열만 복사해뒀다가 ToString()으로 string 객체를 생성합니다.


MSDN에 있는 성능 관련 부분을 확인해보면 좋을것같습니다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        StringBuilder sb = new StringBuilder();
        public void Print()
        {   
            sb.Append("[");
            sb.Append("index");
            sb.Append("]");
            sb.Append("value");
            sb.AppendLine();
            
            Console.WriteLine(sb.ToString());
 
            //// AppendFormat 사용
            sb.Clear();
            sb.AppendFormat("[{0}]{1}""index""value");
            Console.WriteLine(sb.ToString());
        }
cs


Append만을 사용한 코드와 AppendFormat을 사용한 코드입니다. 필요에 따라 사용하시면 될것같군요

결과값은 [index]value 로 두 방법 모두 동일합니다.


이 외에도


- Immutable 객체의 값 접근 시 매번 메모리가 생성될 수 있으므로 주의(string과 유사한 케이스)


- 빈번하게 호출되는 메소드 안에서 일회성 인스턴스가 생성되지 않도록 주의

- Boxing / unboxing이 가능한 한 일어나지 않도록 주의(object 타입 관련)

- WeakReference를 사용한 약한 참조를 통해 의도하지 않은 참조 및 데이터 점유율 줄이기
MSDN에서 소개하는 WeakReference입니다. 추후 포스팅할 기회가 있으면 따로 해보겠습니다.
약한 참조를 통해 GC.Collect시에 메모리가 해제되는 그런 원리라고 보시면 되겠네요.


- IDisposable 인터페이스를 사용하여 원하는 시점에 객체 삭제하기

가 있겠습니다.


요즘은 워낙 고사양이고 c# 자체에서 관리를 해준다고는 하지만 어느정도는 메모리 관리를 해야할 필요가 있는것

같습니다.

반응형
Comments