- 0
- BJRambo
- 조회 수 2601
C#은 일반적으로 메모리를 직접관리 해주는 매니지드 언어입니다.
매지니드 언어란 프로그래밍을 통해서 메모리를 직접 관리하지 않고 프로그래밍 해도 되는 언어라는 것입니다.
메모리를 직접관리하는 언어는 직접적으로 C와 C++이 있습니다.
C에 OOP개념을 더해 나온언어가 C++이고 여기에서 대표적으로 메모리를 관리하는 방식이 포인터와 포인트입니다. (자세히는 모르겟고 이런게 있다는 정도만 알고 있습니다. 이를 통해 지정한 포인터에 메모리값을 넣어두고 필요시 해당 지정포인트의 데이터값을 가져오는 방식으로 출력하는것으로 알고 있어요.)
그럼 C#은 이를 직접적으로 관리 해주는 역할을 합니다.
하지만, 일반적으로 openConnect() 와 비슷한 늬양스를 가진 항목들에서 잘못 사용하면 메모리가 비워지지 않고 뻑나는 경우가 다반사 입니다.
보통 다음과 같은 작업을 할 경우 메모리를 비울 수 있도록 프로그램을 관리해야합니다.
1. 어딘가에 비동기 방식으로 api를 호출하는 httpclient requst 실행시
2. 무엇인가를 연결을 열어주는 늬양스의 작업후 닫아주는 역할이 필요한 경우.
3. 해당 클래스에서 Dispose() 를 지원하는 경우.
이런 경우에는 보통은 메모리를 실행할 경우 재대로 완료가 되지 않거나 실행이후 데이터를 메모리에 가지고 있는 경우가 제경우에는 몇번씩 있어왔습니다.
메모리가 쌓이면 지속적으로 계속 메모리가 쌓이게되고 언젠간 서버자체를 다시 실행시켜야 하는 경우가 발생되곤 합니다.
해결 방법은 간단합니다.
위와 같이 마지막에 Dispose 함수를 실행하면 보통은 모든 메모리를 없애고 자동으로 닫아줍니다.
하지만 매번 매번 httpclient.Dispose() 를 추가하도록 하는 방법은 결국 귀찮아질뿐입니다.
다음과 같이 코드를 깔끔하게 사용할 수 있습니다.
using(var respose = httpClient.GetAsync(UrlString))
{
~~~~
}
이렇게 사용해보세요.
using() 은 Dispose가 가능한 클래스를 이용하여 실행되는 항목들에서 사용이 가능합니다.
매번 httpClient.Dispose를 입력하지 않더라도 마지막에 } using의 갈호가 닫힐 경우 무조건 Dispose를 시켜줍니다.
따라서 sqllite 와 같은 항목을 사용시 매번 CloseConnection 할 필요 없이 openConnection 에서 using을 사용하면 해당 갈호가 끝날때 자동으로 dispose 시키면서 해당 연결도 close 해주는 속성을 가지고 있습니다. (이 부분은 보통 실제 C로 짜여진 함수들을 확인하시길 바랍니다.)
실제로 저는 이렇게 사용하고 있습니다.
using을 생활화 해보시면 메모리 관리에 좀 더 좋아질 것 같아요.