... and a cop pulled me over. And he said, "Hey, are
you small?" I said, "No, I'm tall, I'm tall." He said,
"Well, I'm gonna have to measure ya."
|
-
Steve Martin,
"Let's Get Small"
|
Dealing with Memory
So, you've whipped up another small Waba program. It runs fine on your
PC under a JVM and you package it up with warp and exegen to run it
on a PalmPilot or Windows CE device.
When you run it, you get a message saying the WabaVM is out of memory.
Is that it? Is the program to big for the device?
The answer is most likely no. This page should explain what's going on
and how to get things working.
Fundamentals
Waba programs are executed by a Waba Virtual Machine.
A Waba program consists of classes (usually packaged
in a warp file) and a launch program.
Under PalmOS the launch program is a .prc and under Windows CE,
it is a .lnk (Windows shortcut) file. The job of the
launch program is to start the WabaVM and tell it where
the class files for the Waba program are. It also has
another important responsibility. It tells the WabaVM
how much memory to allocate for the program.
The "exegen" program is used to build launch programs and
it allows you to specify how much memory a WabaVM should allocate
for a program. If you don't specify anything, some
default values will be used. To see the default values, run
the exegen program with no parameters.
The WabaVM allocates 4 chunks of memory from the device it is running
on when it starts up. The launch program tells the WabaVM what size
these chunks are. The 4 chunks of memory are:
- object heap
- class heap
- stack
- native stack
The WabaVM only allocates memory from the device once, when the program
starts up. From them on, it performs memory management within the regions
it allocated. It frees the 4 chunks of memory when the program has completed.
Under PalmOS, the object heap, stack and native stack are allocated from
dynamic memory and the class heap is allocated from storage memory.
If the WabaVM can't allocate the 4 chunks of memory, it will generate
a "can't allocate memory" error. This is different from an "out of memory"
error. The "can't allocate" error means the WabaVM can't allocate the
amount of memory it has been told the program needs when it starts up.
An "out of memory" error message occurs while the program is executing.
It means that the WabaVM allocated the 4 chunks of memory for the program
when it started up but the program is requesting more memory than is
left in one of the chunks.
So, to remove "out of memory" errors, you can increase the size of the
chunk of memory that the program ran out of. If you get an "out of object heap"
error message, for instance, you can specify a larger object heap size
for the program when you use exegen to build the launch program.
This will cause the WabaVM to request a larger chunk of memory for the
object heap when it starts up. On devices with limited amounts of memory,
you have to be careful that you don't specify something too large or
the WabaVM won't be able to allocate the amount of memory requested.
Under a Palm Personal, for instance, the maximum object heap you are probably
going to want to specify is 8K. Under other Palm devices
(Palm Professional, Palm III, etc.) you can specify up to a 64K object
heap. Under Windows CE, you can specify basically any size but it's
still best to keep programs as small as possible even when the
memory is available.
So, we've explained that the WabaVM allocates 4 chunks of memory when it
starts up: object heap, class heap, stack and native stack. But what's
in the four chunks? Below we explain what each chunk of memory is
and how it is used.
The Object Heap
When a Waba program creates an object, the WabaVM looks for
some free memory in the "object heap" where it can put the object.
The object heap is where all objects are kept.
If an object is created and there is no space left in the object
heap for it, the WabaVM will garbage collect the object heap.
Garbage collection is the process of examining the heap to
determine which objects are in use and which objects can
be freed.
If there is still no space for the object after the WabaVM
garbage collects the object heap, then the WabaVM will issue
a message saying the program is out of "object heap".
So, this is where "out of object heap" messages come from.
A simple way of fixing an "out of object heap" message is to
increase the size of the object heap.
The default object heap size is 8K. Why is it this small
by default? It's currently this value to maintain
support for the Palm Personal which has an very small
amount of dynamic memory.
On a Palm Professional, Palm III or Windows CE device, you can
use object heaps that are bigger than 8K but if you want your
program to run on a Palm Personal, you will need to keep
the object heap relatively small.
The amount of memory allocated to the object heap can affect the
performance of a program. If you allocate lots of memory
for the object heap, the program won't perform as many garbage
collections but the process of garbage collection will be a little
slower.
If you allocate too small of an object heap, either the program won't
run or it will perform lots of garbage collections as it tries to
free up space.
The object heap is the only heap where the amount of memory allocated
may have some affect on performance. Changing memory settings for
any of the other chunks will not affect performance in any way.
The Class Heap
When the WabaVM encounters a reference to a new class, it locates
the class (either in memory or on disk) and creates a small data
structure in memory. This data structure contains tables
that allow the WabaVM to quickly look up fields, methods
and constants.
This data is kept in the class heap. The more classes your
program references, the more class heap it will use. The class
heap is not garbage collected.
The Stack
Each time a Waba program calls a method, it pushes data onto
a stack. A program that has deeply nested method calls will require
a larger stack than one that does not.
Methods that are highly recursive can require a large amount of stack
space. The default size of a Waba program's stack is around 1K.
If a program runs out of stack space, it will get a "stack overflow"
error. If you encounter this error, you can increase the size of
the program's stack using exegen.
The Native Stack
The WabaVM contains another stack it uses internally. This is known
as the native stack. Its default size is around 300 bytes. You will
probably never need to increase its size, but
it is possible you might need to if you use large multi-dimensional arrays.
If you get a "native stack overflow" error, it means the program has run
out of native stack.
Final Thoughts
Memory management in Waba is a little trickier than other platforms.
It would be nice if the WabaVM automatically adjusted the size
of its heaps depending on what is available on the device and what
it estimates the program requires.
We may do this in a future release but in the meantime, you'll
probably need to do some memory parameter tuning in exegen.
The reason the WabaVM doesn't try to determine the sizes itself
in the current release is because it's not easy to
determine programmatically how much memory a program will
need or to adapt memory regions dynamically while a program
is running on a small device.
On large machines (desktops, servers), memory management is easier
since if you run out of a chunk of memory, you can just allocate a
larger one and copy the smaller one in.
But on a small device, when you are out of a chunk of memory, its
likely you won't have the space available to allocate another larger
chunk while holding on to the smaller chunk so it can be copied in.
So, we opted to allow programmers to determine the sizes of the heaps
since they have knowledge of what the program will require when it runs
before it actually starts executing.
Copyright (c) 1999 - 2001 Wabasoft. Waba, WabaVM and WabaSDK are trademarks of
Wabasoft Inc.