Today I tried to find out if it would be possible to allocate a large amount of
memory in a VM.
I used the official 32-bit VM
(http://gforge.inria.fr/frs/download.php/29042/CogVM-Unix-13307.zip) and a
Pharo 1.3 (http://gforge.inria.fr/frs/download.php/29273/Pharo-1.3-13315.zip)
derived image on Ubuntu 11.04 (x86_64) Amazon AWS EC2 m1.large instance (about
8Gb RAM) and the following bash and Smalltalk scripts:
run.sh
#!/bin/bash
script_home=$(dirname $0)
script_home=$(cd $script_home&& pwd)
image=$script_home/pharo-t3.image
script=$script_home/run.st
args=$*
vm=$script_home/bin/CogVM
options="-mmap 1536m -vm-display-null -vm-sound-null"
#echo $vm $options $image $script $args
$vm $options $image $script $args
run.st
| args size monolithic object |
FileStream stdout wantsLineEndConversion: true.
Smalltalk garbageCollect.
FileStream stdout
nextPutAll: 'Running run.st with args: ';
nextPutAll: Smalltalk commandLine arguments printString;
cr;
nextPutAll: Smalltalk vmStatisticsReportString.
args := Smalltalk commandLine arguments.
size := args first asInteger.
monolithic := (args size> 1 and: [ args second = 'monolithic' ]).
monolithic
ifTrue: [
object := ByteArray ofSize: size * 1024 * 1024 ]
ifFalse: [
object := Array ofSize: size * 1024.
1 to: size * 1024 do: [ :each |
object at: each put: (ByteArray ofSize: 1024) ] ].
Smalltalk garbageCollect.
FileStream stdout
nextPutAll: 'Allocation of a size ';
print: object size;
space;
print: object class;
nextPutAll: ' OK';
cr;
nextPutAll: Smalltalk vmStatisticsReportString.
Smalltalk quitPrimitive.
These were the results trying to allocate 1GB:
$ ./run.sh 1024
Running run.st with args: #('1024')
uptime 0h0m0s
memory 49,103,224 bytes
old 36,625,732 bytes (74.60000000000001%)
young 9,812 bytes (0.0%)
used 36,635,544 bytes (74.60000000000001%)
free 12,467,680 bytes (25.400000000000002%)
GCs 8 (90ms between GCs)
full 2 totalling 212ms (29.400000000000002% uptime),
avg 106.0ms
incr 6 totalling 10ms (1.4000000000000001% uptime), avg
1.7000000000000002ms
tenures 0
Allocation of a size 1048576 Array OK
uptime 0h0m26s
memory -1,007,414,928 bytes
old -1,020,337,428 bytes (101.30000000000001%)
young 5,888 bytes (0.0%)
used -1,020,331,540 bytes (101.30000000000001%)
free 12,916,612 bytes (-1.3%)
GCs 590 (44ms between GCs)
full 62 totalling 14,735ms (56.6% uptime), avg
237.70000000000002ms
incr 528 totalling 10,225ms (39.300000000000004% uptime),
avg 19.400000000000002ms
tenures 519 (avg 1 GCs/tenure)
Since last view 582 (44ms between GCs)
uptime 25.3s
full 60 totalling 14,523ms (57.400000000000006%
uptime), avg 242.10000000000002ms
incr 522 totalling 10,215ms (40.300000000000004% uptime),
avg 19.6ms
tenures 519 (avg 1 GCs/tenure)
$ ./run.sh 1024 monolithic
Running run.st with args: #('1024' 'monolithic')
uptime 0h0m0s
memory 49,103,216 bytes
old 36,627,976 bytes (74.60000000000001%)
young 9,844 bytes (0.0%)
used 36,637,820 bytes (74.60000000000001%)
free 12,465,396 bytes (25.400000000000002%)
GCs 8 (46ms between GCs)
full 2 totalling 208ms (56.1% uptime), avg 104.0ms
incr 6 totalling 10ms (2.7% uptime), avg 1.7000000000000002ms
tenures 0
Allocation of a size -1073741824 ByteArray OK
uptime 0h0m2s
memory -1,020,427,928 bytes
old -1,037,112,380 bytes (101.60000000000001%)
young 5,952 bytes (0.0%)
used -1,037,106,428 bytes (101.60000000000001%)
free 16,678,500 bytes (-1.6%)
GCs 13 (177ms between GCs)
full 4 totalling 725ms (31.5% uptime), avg 181.3ms
incr 9 totalling 14ms (0.6000000000000001% uptime), avg 1.6ms
tenures 0
Since last view 5 (386ms between GCs)
uptime 1.9000000000000001s
full 2 totalling 517ms (26.8% uptime), avg 258.5ms
incr 3 totalling 4ms (0.2% uptime), avg 1.3ms
tenures 0
Basically it seems to work.
What I find particulary strange is that #vmStatisticsReportString starts
reporting negative sizes, also the size of the 1GB ByteArray is reported as
negative. Why ?
Tomorrow I might try to find out how much further I can take this ? How close
to 4GB ?
Anybody else tried this ?
Sven