windows - Bevidst at spise bestemte mængder hukommelse ved hjælp af perl script

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg skal simulere en hukommelses-sulten proces. For eksempel, På en maskine med 4,0 GiB, har jeg brug for en proces, der ville spise 3,2 GiB (giv eller tag nogle MiB).


Jeg antog, at det skal være så nemt som:


my $mbytes = 3276;
my $huge\_string = 'X' x ($mbytes * 1024 * 1024);


Men jeg ender med at spise spiser dobbelt så meget hukommelse som jeg har brug for det til.



  • Dette er det samme på to Windows 7 amd64-maskiner: en med 64-bit, den anden
    med 32-bit build af jordbær Perl

  • Jeg bruger Sysinternals Process Explorer og ser 'Private Bytes'



Selvfølgelig kunne jeg bare $mbytes /= 2 (for nu vil jeg nok gøre det), men:



  • Er der en bedre måde?

  • Kan nogen forklare, hvorfor mængden er dobbelt så lang som strengen?


Bedste reference


Kode tilpasset fra http://www.perlmonks.org/index.pl?node\_id=948181, alt kredit går til Perlmonk BrowserUk. [5] [6]


my $huge\_string = 'X';
$huge\_string x= $mbytes * 1024 * 1024;






  hvorfor mængden er dobbelt så lang som strengen?



Tænk på rækkefølgen af ​​evalueringen. Det højre udtryk tillægger hukommelse til din x -udtryk, og igen gør det også opgaven i din nye skalar. Som normalt for Perl, selvom højre udtryk ikke længere er henvist til, bliver hukommelsen ikke frigivet med det samme.


Drift på en eksisterende skalar undgår den anden tildeling, som vist ovenfor.