Visual Basic - Technik, FAQ, Tricks, Beispiele

Home / System / Windows / Memory

Speichernutzung analysieren

Einleitung

In manchen Situationen wäre es hilfreich zu wissen, wieviel Speicher das Betriebssystem noch zur Verfügung stellen kann bzw. wie die Speicherausnutzung (in %) gerade aussieht. Windows kennt dafür die API-Routine GlobalMemoryStatus, welche dann auch in den unten gezeigten Funktionen verwendet wird.

Beispiele

Das folgende Beispiel startet eine Anwendung nur dann, falls die Speicherausnutzung weniger als 90% beträgt:

If MemoryStatus.MemoryLoad < 90 Then
  Shell "c:\test\bigprog.exe"
Else
  MsgBox "Zu wenig Speicher", vbExclamation
End If

Die folgende ShowMemory-Proedur zeigt eine kleine Info-Box mit dem aktuellen Speicherzustand (in MegaBytes) an:

Sub ShowMemory()
  Dim s As String
  
  With MemoryStatusMB
    s = "Realer Speicher:" & vbNewLine & _
        Str(.AvailPhys) & " von" & Str(.TotalPhys) & _
        " MB verfügbar" & vbNewLine
    s = s & "Virtueller Speicher: " & vbNewLine & _
        Str(.AvailPageFile) & " von" & Str(.TotalPageFile) & _
        " MB verfügbar"
  End With
  MsgBox s, vbInformation, "Speicherstatus"
End Sub

Man beachte, wie durch Nutzung des With-Blocks der mehrfache Aufruf der API-Routine vermieden wird.

Code / Quelltext

In einem Modul müssen die folgende Struktur und API-Funktion deklariert werden. Man beachte, welche Informationen vom System überhaupt geliefert werden:

Public Type typMemoryStatus
  Length As Long        'Länge der Struktur (32 Bytes)
  MemoryLoad As Long    'Speicherausnutzung in % (0 bis 100)
  TotalPhys As Long     'Realer Speicher, insgesamt
  AvailPhys As Long     'Realer Speicher, verfügbar
  TotalPageFile As Long 'Auslagerungsdatei, insgesamt
  AvailPageFile As Long 'Auslagerungsdatei, verfügbar
  TotalVirtual As Long  'Virtueller Speicher, insgesamt
  AvailVirtual As Long  'Virtueller Speicher, verfügbar
End Type

Private Declare Sub GlobalMemoryStatus Lib "kernel32" ( _
    lpBuffer As typMemoryStatus)

Die folgenden Funktionen rufen einfach die gerade gezeigte API-Funktion auf und rechnen ggf. in die gewünschte Einheit um:

'Ergebnisse in Bytes:
Public Function MemoryStatus() As typMemoryStatus
  MemoryStatus.Length = Len(MemoryStatus)
  GlobalMemoryStatus MemoryStatus
End Function

'Ergebnisse in KiloBytes:
Public Function MemoryStatusKB() As typMemoryStatus
  MemoryStatusKB.Length = Len(MemoryStatusKB)
  GlobalMemoryStatus MemoryStatusKB
  With MemoryStatusKB
    .AvailPageFile = .AvailPageFile \ 1024
    .AvailPhys = .AvailPhys \ 1024
    .AvailVirtual = .AvailVirtual \ 1024
    .TotalPageFile = .TotalPageFile \ 1024
    .TotalPhys = .TotalPhys \ 1024
    .TotalVirtual = .TotalVirtual \ 1024
  End With
End Function

'Ergebnisse in MegaBytes:
Public Function MemoryStatusMB() As typMemoryStatus
  MemoryStatusMB.Length = Len(MemoryStatusMB)
  GlobalMemoryStatus MemoryStatusMB
  With MemoryStatusMB
    .AvailPageFile = .AvailPageFile \ 1048576
    .AvailPhys = .AvailPhys \ 1048576
    .AvailVirtual = .AvailVirtual \ 1048576
    .TotalPageFile = .TotalPageFile \ 1048576
    .TotalPhys = .TotalPhys \ 1048576
    .TotalVirtual = .TotalVirtual \ 1048576
  End With
End Function

© Jost Schwider, 26.10.2001-26.10.2001 - http://vb-tec.de/memstat.htm