그래서 Windows에서이 프로그램을 실행하여 D 가비지 수집기가 제대로 작동하는지 테스트하려고했습니다.D 가비지 수집기가 작동합니까?
DMD 2.057 및 2.058 베타 모두 내가 -release
, -inline
, -O
을 지정 여부에 관계없이 동일한 결과를 제공 등
코드 :
import core.memory, std.stdio;
extern(Windows) int GlobalMemoryStatusEx(ref MEMORYSTATUSEX lpBuffer);
struct MEMORYSTATUSEX
{
uint Length, MemoryLoad;
ulong TotalPhys, AvailPhys, TotalPageFile, AvailPageFile;
ulong TotalVirtual, AvailVirtual, AvailExtendedVirtual;
}
void testA(size_t count)
{
size_t[] a;
foreach (i; 0 .. count)
a ~= i;
//delete a;
}
void main()
{
MEMORYSTATUSEX ms;
ms.Length = ms.sizeof;
foreach (i; 0 .. 32)
{
testA(16 << 20);
GlobalMemoryStatusEx(ms);
stderr.writefln("AvailPhys: %s MiB", ms.AvailPhys >>> 20);
}
}
출력이었다
AvailPhys: 3711 MiB
AvailPhys: 3365 MiB
AvailPhys: 3061 MiB
AvailPhys: 2747 MiB
AvailPhys: 2458 MiB
core.exception.OutOfMemoryError
delete a;
문을 주석 처리하지 않은 경우 출력은
AvailPhys: 3714 MiB
AvailPhys: 3702 MiB
AvailPhys: 3701 MiB
AvailPhys: 3702 MiB
AvailPhys: 3702 MiB
...
그래서 분명히 ... GC가 실제로 작동합니까?
... whoa. D2에서 완전히 깨졌습니다? – Mehrdad
아니요, 당연히 아닙니다 - 당신이 방금 모퉁이 케이스 또는 뭔가를 쳤을 것입니다. –
재밌 네요. 문자 그대로 GC를 명시 적으로 테스트하려고 시도한 첫 번째 것입니다. – Mehrdad