2016-10-18 3 views
0

저는 Delphi 2007을 사용하므로 32 비트의 사용 가능한 메모리 제한이 있습니다.프로세스의 사용 가능한 메모리를 얻으십시오

function MemoryUsed: Int64; 
var 
    PMC: _PROCESS_MEMORY_COUNTERS_EX; 
begin 
    Win32Check(GetProcessMemoryInfo(GetCurrentProcess, @PMC, SizeOf(PMC))); 
    Result := PMC.PrivateBytes; 
end; 
:

{$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE} // Allows usage of more than 2GB memory 

이 내가 프로세스의 현재 메모리 사용을 얻기 위해 사용하는 방법은 다음 IMAGE_FILE_LARGE_ADDRESS_AWARE PE 플래그를 사용

, 3 기가 바이트 제한 대신이 2GB가 있어야한다

이제 프로세스에 사용할 수있는 총 메모리 양을 얻는 방법을 원합니다. 약 3GB 여야합니다. 하지만 저는 하드 코딩을 원하지 않습니다. 앞으로는 새로운 델파이와 64 비트로 옮길 것입니다.

어떤 Win32 API 함수를 사용해야합니까?

사용 가능한 메모리 - 컴퓨터 사용 가능한 메모리 - 아마도 8GB RAM이 설치되어있을 수 있습니다. 더 많은 작업이 필요한 경우 OS가 메모리를 디스크로 스왑을 시작합니다.

처리 가능 메모리 - 실행 파일 및 Windows의 제한 사항. 이제 대부분의 Windows는 64 비트이므로 문제는 아닙니다. 그러나 실행 파일이 IMAGE_FILE_LARGE_ADDRESS_AWARE으로 32 비트로 컴파일 된 경우 한도는 3GB 여야합니다. 맞습니까? 실행 파일이 64 비트 일 때, 64GB가 훨씬 더 큽니다 (그러나 설치된 RAM이 적 으면 스와핑이 발생할 수 있습니다 ...).

제 질문은 프로세스의 사용 가능한 메모리를 어떻게 얻을 수 있습니까?

+1

사용 가능한 메모리를 정의하십시오. 프로세스는 64 비트 시스템에서 전체 4GB 주소 공간을 사용할 수 있습니다. 현재 예약되지 않은 공간을 모두 할당 할 수 있습니다. 어쨌든 정보로 무엇을 할 것입니까? –

+0

질문을 명확하게하려고합니다. –

+0

원하는 주소 공간입니다. 그것은 2, 3 또는 4 중 하나입니다. 3 일 가능성은 낮습니다. 요즘에는/3GB 스위치로 부팅 한 많은 32 비트 시스템을 찾을 수 없습니다. –

답변

1

몇 가지 분명한 조치를 취할 수 있습니다. GetSystemInfo으로 전화를 걸어 lpMaximumApplicationAddress에서 lpMinimumApplicationAddress을 뺀 다음 사용 가능한 주소 공간을 찾으십시오.

사용 가능한 실제 메모리의 양은 구하기가 훨씬 어려우며 고정 된 양이 아닙니다. 당신은 다른 모든 프로세스와 경쟁하고 있으므로 매우 유동적이고 동적 인 개념입니다. 시스템에서 사용 가능한 실제 메모리의 양을 확인하려면 GlobalMemoryStatusEx을 호출하십시오. 그것도 다른 정보를 반환하지만 그것을 잘못 해석하는 것은 매우 쉽습니다. 사실이 API는 프로세스에 사용 가능한 가상 메모리의 양을 알려주며 첫 번째 단락과 동일한 정보를 제공합니다.

아마도 실제 및 총 가상 메모리의 최소값 일 것입니다. 그러나 나는 말하고 싶지 않다. 오해의 여지가있는 메모리 통계를 기반으로 잘못된 결정을 내림으로써 수행 능력을 불필요하게 제한하는 많은 코드 예제를 보았습니다.

+0

lpMaximumApplicationAddress가 맞지 않습니까? – Fritzw

관련 문제