2017-11-24 13 views
0

최근에 .Net Core 2.0 응용 프로그램 중 하나에서 메모리 스파이크 문제가있었습니다. 우리가 메모리 덤프를 분석 할 때, 우리는 공개되지 않은 약 2GB의 여유 공간을 발견했습니다..NET 코어 메모리가 공개되지 않았습니다.

다음은 windbg 도구의 통계입니다.

Statistics: 
MT     Count TotalSize  Class Name 
000000e32eaf4ca0 15404 2584481422  Free 

메모리가 공개되지 않는 이유가 무엇인지 알려 주실 수 있습니까? 적어도 다음과 같은 이유로

+1

일반적으로 고정 된 개체가 너무 많습니다. –

답변

0

:

  • .NET은 프로그램이
  • 완전한 블록을하지 않는 메모리의 자유 부분
  • 가 OS에 돌려주고 다시 곧 메모리를 필요가 있다고 생각

1.)에 대해서는 운영 체제에서 가져온 메모리를 유지할 수 있습니다. 운영 체제에서 다시 가져온 다음 운영 체제에서 다시 확보하면 성능에 영향을주기 때문입니다. 가까운 미래에 .NET에서 프로그램이 메모리를 요청할 것이라고 생각하면 간단하게 "캐시"할 수 있습니다.

2)에 대해서는 예제에서 가장 잘 설명되어 있습니다. 응용 프로그램에서 10MB를 요청했다고 가정합니다. .NET은 OS에서 50MB 블록을 차지할 수 있습니다. 그런 다음 응용 프로그램은 1MB를 요청합니다. .NET은 기존의 50 MB 블록에 넣습니다. 10MB가 해제됩니다. 그러나 .NET에 49MB의 메모리를 다시 할당 할 수는 없습니다. 메모리를 다시 OS에 부여하는 것은 주어진 크기로만 수행 할 수 있기 때문입니다.

.NET은 VirtualAlloc()VirtualFree()에서 직접 작동하므로 가능성이 다소 제한됩니다.

Count 열을 보면 2.5GB가 인접하지 않음을 알 수 있습니다. 그것은 15000 조각으로 나뉩니다. 프로그램에서 메모리 단편화가 발생할 수 있습니다. 고정 된 핸들 및 대형 오브젝트 힙 (heap)으로 인해 작은 오브젝트 힙에서 압축되지 않기 때문에 메모리 조각화가 발생할 수 있습니다.