Well, the most obvious cause of this is memory leaks in your application But, if you've thoroughly investigated using tools like jconsole, yourkit, jprofiler or any of the other profiling and analysis tools out there and you can eliminate your code as the source of the problem, it may be due to bug(s) in the JVM.
One symptom is OutOfMemory exceptions, accompanied by a message such as
"java.lang.OutOfMemoryError: requested 32756 bytes for xxx. Out of swap space?".
Sun bug number 4697804 describes how this can happen in the scenario when the garbage collector needs to allocate a bit more space during its run, tries to resize the heap but fails because the machine is out of swap space. One suggested work around is to ensure that the jvm never tries to resize the heap, by setting min heap size to max heap size:
Another workaround is to ensure you have configured sufficient swap space on your device to accommodate all programs you are running concurrently.