2016-06-14 7 views
0

이 코드는 중복 된 것처럼 보일 수 있지만이 특정 사례는 약간 다를 수 있습니다.명시 적으로 메모리를 확보하십시오.

내 MVC 응용 프로그램에서 Excel 시트와 비슷한 테이블을 표시하는 데 사용되는 큰 목록이 포함 된 ViewModel이 있습니다. 각 MyComplexClass에는 MyComplexClass 및 MyComplexColumn 목록이 포함되어 있습니다.

이것은 꽤 큰 메모리 사용을하지만, 지금은 문제가 있습니다. 내 큰 테이블을 정리하고 다른 데이터 세트를로드하는 메소드를 작성해야한다. 내가 좋아하는 뭔가를 작성할 수

MyViewModel.Lines = new List<MyComplexClass>(); 
    MyViewModel.LoadNewSetOfData(SetOfData); 

을하지만, 명시 적으로 이전 목록에 내 참조를 상실하는 C의 배경에서 오는 내가 할 수있는 일이 아니며, 매일 아침 거울에 내 얼굴을보고 계속합니다.

는 내가 널 (null)에 대한 참조를 설정 한 다음

GC.Collect() 

를 호출 할 수 있습니다, Here, HereHere을 보았다하지만 내가 정말 영향을 수 있습니다, 특히 있기 때문에, 정말 가장 좋은 방법은 아니라고 들었다 성능 및 GC가이 특정 메모리 할당을 처리했는지 여부를 알 수 없기 때문입니다.

방금 ​​Free()와 같은 어떤 것을 호출하여 사용할 수있는 방법이 없습니까?

고맙습니다.

+3

그냥 살아서 GC가 제대로 작동하도록하십시오. –

+0

* "이것은 꽤 큰 메모리 사용량을 만듭니다"* - 그래서 당신은 정말로 추억에서 벗어나거나 그것에 대해 걱정하고 있습니까? 두 번째 옵션 - 심각하게 생각하지 않으면 GC는 대부분의 경우 잘 처리됩니다. –

+0

네, GC가 당신보다 더 낫습니다. 명시 적으로 메모리를 비우지 않는 것이 부끄럽지 않습니다. – Master117

답변

4

걱정하지 마세요. 가비지 컬렉터가 메모리를 회수하도록 "권장"하려는 시도는 좋은 생각이 아닙니다. 단지 백그라운드에서 작업을 수행하도록 남겨 두십시오.

다른 데이터 세트를로드하기 만하면됩니다. 메모리가 부족 해지면 GC는 아무 것도하지 않고도 메모리를 회수하고 가용 메모리가 충분하면 가비지 콜렉션을 사용하지 않고 새 세트를로드 할 수 있습니다.

+0

그래서 C#에서 메모리 공간을 확보 할 방법이 전혀 없습니까? 내 말은, C에서 dll을 쓰는 것 이외에, 내 C# 코드에서 호출하는 것 말인가? –

+0

@MarrowGnawer - 아마도 질문은 왜 메모리를 확보하는 것에 대해 많은 걱정을하는 것입니까? – Sean

+0

15 년의 C로 나를 미치광이로 변하게 만들었습니다. ... –

1

짧은 답변 - 가비지 수집에 대해 걱정하지 마십시오. 내가 걱정할 수있는 유일한 시간은 거대한 양의 객체와 데이터를 제대로 가비지 수집하지 못할 수도있는 곳에 두는 것입니다. 예를 들어, ASP.NET 세션에 사용자 단위로 많은 양의 데이터를 저장하면 사용자가 몇 페이지를 방문하더라도 데이터가 오랫동안 저장됩니다.

그러나 객체에 대한 참조가 해제 될 때 (범위를 벗어나면) 가비지 수집이 수행됩니다. 그것은 완벽하지는 않을 수도 있지만 실제로는 정말 좋습니다. 대부분의 경우에 좋은 가비지 수집을 개발하는 작업과 생각은 아마도 우리가 응용 프로그램 자체를 개발하는 작업을 초과 할 것입니다.

우리가 트리거 할 수는 있지만 .NET 프레임 워크의 디자인은 고의적으로 메모리가 해제 될 때와 같이 더 작은 세부 사항에 대해 걱정할 필요없이 더 높은 수준의 추상화에 집중할 수있게합니다.

관련 문제