Active Directory 정보를 쿼리하고 메모리에 보관되는 Datatable에 약 15 개의 속성을 저장하는 응용 프로그램이 있습니다.내 VB.NET 응용 프로그램의 커밋 크기를 줄이는 데 도움이 필요합니다.
"커밋"메모리의 양을 줄여야합니다.
응용 프로그램은 시스템 트레이에서 활성 상태로 유지되며 사용자의 그림과 함께 정보를 빠르게 검색 할 수 있습니다.
나는 메모리 사용량을 상당히 낮출 수있는 클래스가 있습니다. 그것은 매 10 초마다 타이머에서 실행되며, 아래 : 응용 프로그램 후
Public Class MemoryManagement
Private Declare Function SetProcessWorkingSetSize Lib "kernel32.dll" (ByVal process As IntPtr, ByVal minimumWorkingSetSize As Integer, ByVal maximumWorkingSetSize As Integer) As Integer
Public Shared Sub FlushMemory()
GC.Collect()
GC.WaitForPendingFinalizers()
If (Environment.OSVersion.Platform = PlatformID.Win32NT) Then
SetProcessWorkingSetSize(GetCurrentProcess().Handle, -1, -1)
End If
End Sub
End Class
작업 관리자를로드 보여줍니다 다음
작업 집합 (메모리) - 30,000K
메모리 (개인 작업 집합) - 13,000K
커밋 크기 -
몇 초 후 메모리 관리 클래스에 대한 메모리 사용을 줄일 수 25,000K :
세계에 법과를 왕 세트 (메모리) - 700K
메모리 (개인 작업 집합) - 600K
은 커밋 크기 - 25,000K 내가 눈치 챘을
한 것은 커밋 크기 (아래로 간다 사실 계속 증가 할 것이다 결코이다 매우 천천히) 며칠 동안. 2 일 후 커밋 크기로 36,000K가되었습니다.
이제 나는 dispose 메서드를 허용하고 다른 개체를 = 아무것도 설정하지 않는 모든 개체를 삭제합니다.
작업 관리자를 보면 다른 응용 프로그램은 커밋 크기에 큰 발자국이 없습니다.
커밋 크기를 조정하는 방법에 대한 아이디어가 있습니까?
편집 : CSIDir에 대한
요약 : 나는 아래 CLR 프로파일 러에서 정보의 일부를 포함 시켰습니다 아래의 제안 당
.EXE
할당 된 바이트 : 15,097,943
재배치 바이트 : 3,680,460
최종 힙 바이트 : 1,612,611
개체 확정 : 16,194
긴급 개체 완성 148 개
겐 0 컬렉션 19
겐 1 모음 17
겐 2 모음집 : 16
유도 된 콜렉션 : 16
Gen 0 힙 바이트 : 769,019
Gen 1 힙 바이트 : 156 141
2 세대 힙 바이트 : 947,492
큰 개체 힙 바이트 : 40,706
핸들 생성 : 4,664
핸들이 파괴 : 278
힙 덤프 : 1
코멘트 : 0
타이머 중 하나를 잘라내어 응용 프로그램 내에서 일부 코드를 변경하여 스레드 및 메모리의 수를 약간 줄일 수있었습니다. CLR 프로파일 러는 정보 처분을 위해 필요한 영역을 결정하는 데 많은 도움을주었습니다. 저는 가상 메모리를 줄이기 위해 커 큐어를 사용하고 있습니다. CLR 프로파일 러를 사용하면 최대 10MB 만 사용하므로 커밋 된 가상 메모리가 25MB에서 절대 변경되지 않는 이유는 분명하지 않습니다. – JoshF