Discussion:
Memory leaks revisited
Stefano Corsi
2003-05-02 15:13:44 UTC
Permalink
I'm still experimenting with odd, iterative tests:

void test3(int count) {
for (int a = 0; a < 100; a++) {
for (int i = 0; i < seed; i++) {
String arr[][][][][][][] = <String[][][][][][][]>{{{{{{{ "dog"
}}}}}}};
print arr[0][0][0][0][0][0][0] + "\n";
}
}
}

test3(1000);

This one fails with both moto_0_19_1 and my moto_opo branch:

### Allocation failure!
Uncaught AllocationFailureException
message:

AllocationFailureException thrown in test3(excpfn.c:47)
called from function <main>(prova.moto:12)

The strange thing is that it fails also in compiled mode:

### Allocation failure!
### Allocation failure!
Segmentation fault

It succeds, on the other side, with count = 100 and prints "dog" 10.000
times...

test3(100);

Stefano
David Hakim
2003-05-02 14:50:10 UTC
Permalink
The reason this fails in both modes is that the allocation of 7
UnArrays and one string of 4 bytes in each loop iteration is
unavoidable so the 32 megs of default shared heap is used up. Without a
true garbage collector (or good reference counting scheme) that can
determine which of the previously allocated objects are no longer
referenced we must wait until the end of page execution to free them.

However this isn't usually a problem since a single page executing
doesn't in general use that much memory. But once the shared heap
maximum is reached, memory can no longer be allocated. This is unlike
system malloc which can keep allocating forever. This is one of the
real downsides of moto's shared memory manager. It cannot grow above
the size originally specified (by default 32 megs) . The reason it
can't is because it uses mmap to get a blank area in memory to manage.
Once that area is used up I don't know of a good way to ask the
operating system for another shared segment which can then be used by
other processes as well as the requesting process. This problem could
be managed by using system five shmXXX functions, however those have
the alternate problem of not going away when all the processes that are
using them are killed.

-Dave
Post by Stefano Corsi
void test3(int count) {
for (int a = 0; a < 100; a++) {
for (int i = 0; i < seed; i++) {
String arr[][][][][][][] = <String[][][][][][][]>{{{{{{{ "dog"
}}}}}}};
print arr[0][0][0][0][0][0][0] + "\n";
}
}
}
test3(1000);
### Allocation failure!
Uncaught AllocationFailureException
AllocationFailureException thrown in test3(excpfn.c:47)
called from function <main>(prova.moto:12)
### Allocation failure!
### Allocation failure!
Segmentation fault
It succeds, on the other side, with count = 100 and prints "dog" 10.000
times...
test3(100);
Stefano
Continue reading on narkive:
Loading...