C# - 메모리

스택할당

  • stackalloc 키워드를 사용하면 지역 변수에 한해서 스택 할당을 할 수 있음
  • 해당 함수를 벗어나면 메모리는 삭제된다.
  • unsafe 기능으로 사용할 수 있다.
  • MSDN 문서
    • http://msdn.microsoft.com/ko-kr/library/cx9s2sy4.aspx
    • http://msdn.microsoft.com/ko-kr/library/aa664785(v=vs.71).aspx
  • C#에서 포인터 사용하는 방법
    • http://rkddlsghk98.blog.me/30160902176

동적 메모리 할당

  • MSDN
    • http://msdn.microsoft.com/ko-kr/library/aa664786(v=vs.71).aspx

메모리 최적화

  • 필요한 만큼의 데이터 타입을 사용
  • 싱글톤 사용으로 초기 로딩 시간을 줄이고 매번 메모리 할당을 하지 않아도 되므로 메모리 절약
  • 메모리 폴링으로 재사용하기
  • 데이터 스트리밍으로 대량의 메모리를 할당하지 않는다
  • 퍼포먼스 모니터와 CLR Profiler로 조사
  • 원문: [http://msdn.microsoft.com/en-us/magazine/cc163856.aspx]

64비트에서 2기가 바이트 보다 큰 배열 할당하기

  • MSDN: http://msdn.microsoft.com/ko-kr/library/hh285054.aspx

서버 GC 사용하기

  • 논리 프로세서 마다 힙을 가진다.
  • app.config에서
    • <gcServer enabled=”true” />
  • 자세한 설명 http://www.simpleisbest.net/post/2011/04/27/Using-Garbage-Collection-Modes.aspx

.NET Garbage Collection

  • SustainedLowLatency 모드를 사용하여 GC를 계속적으로 off 시킬 수 있다
  • 조언
    • 너무 잦은 객체 할당을 피해라
    • 너무 많은 참조를 피해라
    • 너무 많은 2세데 객체들을 만들지 마라
    • Dispose Pattern을 사용하여 Finalizer 호출을 삼가해라. Finalizer 호출되어야 하는 객체는 항상 1세대로 승급한다.
  • http://xxxq.tistory.com/95

GC 이해와 CLR

  • http://www.hoons.net/board/cshaptip/content/44651

닷넷 가비지 컬렉션 다시 보기

  • http://www.simpleisbest.net/?tag=/Garbage-Collection

Dispose Pattern

  • http://www.simpleisbest.net/post/2011/08/22/Dispose-Pattern-Basic.aspx
  • http://www.simpleisbest.net/post/2011/08/29/Dispose_Pattern_Advanced.aspx

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

  • http://dosun99v.blogspot.kr/2013/01/c.html

가비지 컬렉션

  • 호출빈도를 줄이자. 동적메모리 사용의 낭비 제거.
  • 문자열 조합. operator + (아는 내용) —> StringBuilder로 변경. 지역변수로 선언해서. 매번 그 부분을 반복 사용하게 변경하는 방식. ^^
  • XML파싱때 의외로 속도가 빨라졌음.

메소드 안에서 new

  • Vector3를 메소드에서 new로 생성하는 코드들. 변수가 가비지로 생성한다.
  • 자주 호출되는 경우. 멤버변수로 선언해서 사용하자.
  • 메소드 안에서만 사용되는 인스턴스.
  • 구조체로 바꾸자. 스택에 생성되니까

Boxing/Unboxing

  • Value, Reference Type. 서로 변환에 따른 가비지 생성에 따른 부하 문제. 박싱/언박싱은 느리니까.
  • 어디서 많이 발생되는가?
  • Collection. ArrayList, 해쉬테이블 같은 것.
  • 부하가 심함. 힙과 스택을 오가다 보니. 가비지가 생성되어서 느려진다. 매프레임마다 하면 재앙수준이 되겠다.
  • ArrayList -> List<>로 바꿔 쓰자.

메모리가 어디선가 늘고 있어요

  • 의도하지 않은 참조.
  • 관리 되지 않는 참조.
  • 캐릭터 매니저 <-> 인스턴스 생성.(캐릭터 객체) <-> 캐릭터 위치 표시 객체
  • 삭제했는데… 캐릭터 객체를 삭제하지 않는 경우.
  • 여러 곳에서 class Char 객체 참조가 늘어나서… 어딘가에서 삭제 했을 때 내가 미처 못했던 곳에서 삭제되지 않아 문제 발생.

WeakReference 소개

  • 참조 전용 객체라면 WeakReference사용 권장. 단순 참조 하는 경우엔 권장.
  • 가비지 컬렉션에 의한 회수를 허용하면서 참조.
  • 삭제된 참조 값은 null 변함. (가비지가 회수를 할 때 / 어디선가 삭제 될 때….)
  • 문법은 WeakReference 이름 = new WeakReference( 객체 );
  • Dispose패턴을 이용해보자. 객체 인스턴스의 기능 정지를 명시하세요.
  • 가비지 컬렉션은 자동으로 수행.
  • 더 이상 사용되지 않는 것을 명시.
  • Dispose()안에서 명시.

이 글은 2019-03-18에 작성되었습니다.