2017-11-20 2 views
1

.net Windows 서비스 응용 프로그램을 시작할 때 서버의 기존 메모리를 모두 할당합니다. 메모리 프로파일 링 후 할당 된 메모리의 90 %가 Gen 2 Heaps에서 무료라는 것을 알 수 있습니다. 단편화가 100 %입니다.메모리 할당/100 % 힙 gen2 조각화 서버에서

내 워크 스테이션에서 .exe를 통해 응용 프로그램을 실행해도 동일한 결과가 나오지 않습니다. 여기서 메모리 할당 솔기가 정상입니다.

GC에 문제가 있는지 5 초마다 강제로 확인하려고했습니다. 같은 문제

내 질문 1.이 경우 메모리 조각화가 발생할 수있는 원인은 무엇입니까? 2. Windows 서비스가 내 데스크톱처럼 작동하도록 구성하는 방법이 있습니까? 3. 문제의 원인을 찾으려면 어떻게해야합니까?

덕분에

+0

할당 된 메모리의 90 %가 Gen2 힙에서 무료라는 것은 무엇을 의미합니까? 메모리가 비어 있거나 할당되어 있습니까? 무료 인 경우 Gen2에 없습니다. – Asik

답변

0

서비스와 데스크톱 응용 프로그램 사이의 가장 중요한 차이점은 응용 프로그램을 실행하는 사용자입니다 많이. 서비스 제어판의 "로그온"탭에서 확인하십시오. 기본값은 "로컬 시스템 계정"으로 데스크톱 사용자보다 권한이 적을 수 있습니다. 현재 사용자로 변경하고 응용 프로그램을 다시 확인하십시오.

죽기 직전 인 모든 개체와 "finalizer 큐"라는 대기열에 넣어집니다. GC는 파이널 라이저를 하나씩 실행하고, 파이널 라이저가 무한 루프에 걸리면 전체 GC가 차단됩니다. 가장 눈에 띄는 효과는 메모리 사용량의 절대로 증가하지 않는 것입니다. 이런 코드를 추가하여 시뮬레이트 할 수 있습니다.

~MyClass 
{ 
    while (true) 
    { 
    } 
} 

먼저 모든 종료자를 확인하십시오. 로컬 시스템 계정에서 실행하면 어딘가에서 무한 루프가 발생할 수 있습니다.

아마도 finalizers가 없으므로 여기에 몇 가지 발견 적 방법을 사용해야합니다. 또한 free가 아닌 object에 대한 모든 힙을 가로 지르는 dotMemory (무료는 아니지만 시험 사용 기간이 있음) 유틸리티가 있습니다. 도움이 될 수 있습니다.