Not a subscriber?

Join thousands of others who are building self-directed lives through creativity, grit, and digital strategy—breaking free from the 9–5.
Receive one free message a week

Android: Db4o StackOverflowError

I‘m using db4o for a persistence store in an Android app since db4o allows FREE usage in Android apps I decide it would be a good fit. Until I ran into the an error I could not get around for a couple of weeks.

Over the last couple of weeks I’ve been dealing with an error from hell, the StackOverflowError. I reworked the object model, I cut down the calls, trimmed up all the fat in the Android app I could find and I couldn’t find what was causing the db40 classes to throw a StackOverflow error.

The error that I’d get back would look like this:


06-12 18:31:06.630: DEBUG/dalvikvm(17018): newInstance failed: no ()
 06-12 18:31:06.640: INFO/dalvikvm(17018): Stack overflow, expanding  (0x41869200 to 0x41869000)
 06-12 18:31:06.640: INFO/dalvikvm(17018): Shrank stack (to 0x41869200,  curFrame is 0x41869698)
 06-12 18:31:06.640: DEBUG/AndroidRuntime(17018): Shutting down VM
 06-12 18:31:06.640: WARN/dalvikvm(17018): threadid=3: thread exiting  with uncaught exception (group=0x4001b180)
 06-12 18:31:06.690: DEBUG/dalvikvm(17018): GC freed 5995 objects /  562312 bytes in 36ms
 06-12 18:31:06.800: DEBUG/dalvikvm(17018): GC freed 3836 objects /  436456 bytes in 79ms
 06-12 18:31:06.840: DEBUG/dalvikvm(17018): GC freed 687 objects / 167288  bytes in 33ms
 06-12 18:31:06.860: ERROR/AndroidRuntime(17018): Uncaught handler:  thread main exiting due to uncaught exception
 06-12 18:31:07.020: DEBUG/Gmail(140): MailEngine.sendOrSaveMessage  messageId=1338387167469109248 refMessageId=0,  conversationId=1338387167469109248
 06-12 18:31:07.030: WARN/ActivityManager(76): Activity pause timeout for  HistoryRecord{449684b8 com.google.android.gm/.ComposeActivity}
 06-12 18:31:07.090: DEBUG/dalvikvm(17018): GC freed 3055 objects /  566504 bytes in 215ms
 06-12 18:31:07.100: ERROR/AndroidRuntime(17018):  java.lang.StackOverflowError
 06-12 18:31:07.100: ERROR/AndroidRuntime(17018):     at  com.db4o.foundation.CircularLongBuffer4.remove(CircularLongBuffer4.java:73)
 06-12 18:31:07.100: ERROR/AndroidRuntime(17018):     at  com.db4o.internal.caching.LRU2QLongCache.produce(LRU2QLongCache.java:40)
 06-12 18:31:07.100: ERROR/AndroidRuntime(17018):     at  com.db4o.internal.caching.LRU2QLongCache.produce(LRU2QLongCache.java:14)
 06-12 18:31:07.100: ERROR/AndroidRuntime(17018):     at  com.db4o.io.CachingBin.getPage(CachingBin.java:153)
 06-12 18:31:07.100: ERROR/AndroidRuntime(17018):     at  com.db4o.io.CachingBin.readInternal(CachingBin.java:65)
 06-12 18:31:07.100: ERROR/AndroidRuntime(17018):     at  com.db4o.io.CachingBin.read(CachingBin.java:57)
 06-12 18:31:07.100: ERROR/AndroidRuntime(17018):     at  com.db4o.io.BinDecorator.read(BinDecorator.java:40)
 06-12 18:31:07.100: ERROR/AndroidRuntime(17018):     at  com.db4o.io.BlockAwareBin.blockRead(BlockAwareBin.java:90)
 06-12 18:31:07.100: ERROR/AndroidRuntime(17018):     at  com.db4o.internal.IoAdaptedObjectContainer.readBytes(IoAdaptedObjectContainer.java:210)
 06-12 18:31:07.100: ERROR/AndroidRuntime(17018):     at  com.db4o.internal.IoAdaptedObjectContainer.readBytes(IoAdaptedObjectContainer.java:201)
 06-12 18:31:07.100: ERROR/AndroidRuntime(17018):     at  com.db4o.internal.LocalTransaction.readPointer(LocalTransaction.java:387)
 06-12 18:31:07.100: ERROR/AndroidRuntime(17018):     at  com.db4o.internal.LocalTransaction.getCurrentSlotOfID(LocalTransaction.java:355)
 06-12 18:31:07.100: ERROR/AndroidRuntime(17018):     at  com.db4o.internal.LocalObjectContainer.readReaderOrWriterByID(LocalObjectContainer.java:437)
 06-12 18:31:07.100: ERROR/AndroidRuntime(17018):     at  com.db4o.internal.LocalObjectContainer.readReaderByID(LocalObjectContainer.java:415)
 06-12 18:31:07.100: ERROR/AndroidRuntime(17018):     at  com.db4o.internal.LocalObjectContainer.readReaderByID(LocalObjectContainer.java:419)
 06-12 18:31:07.100: ERROR/AndroidRuntime(17018):     at  com.db4o.internal.marshall.UnmarshallingContext.readBuffer(UnmarshallingContext.java:127)
 06-12 18:31:07.100: ERROR/AndroidRuntime(17018):     at  com.db4o.internal.marshall.UnmarshallingContext.read(UnmarshallingContext.java:40)
 06-12 18:31:07.100: ERROR/AndroidRuntime(17018):     at  com.db4o.internal.ObjectReference.read(ObjectReference.java:304)
 06-12 18:31:07.100: ERROR/AndroidRuntime(17018):     at  com.db4o.internal.ObjectReference.read(ObjectReference.java:290)
 06-12 18:31:07.100: ERROR/AndroidRuntime(17018):     at  com.db4o.internal.ObjectContainerBase.getHardObjectReferenceById(ObjectContainerBase.java:956)
 06-12 18:31:07.100: ERROR/AndroidRuntime(17018):     at  com.db4o.internal.marshall.AbstractReadContext.classMetadataForObjectId(AbstractReadContext.java:85)
 06-12 18:31:07.100: ERROR/AndroidRuntime(17018):     at  com.db4o.internal.marshall.AbstractReadContext.readObject(AbstractReadContext.java:57)
 06-12 18:31:07.100: ERROR/AndroidRuntime(17018):     at  com.db4o.internal.marshall.AbstractReadContext.readAtCurrentSeekPosition(AbstractReadContext.java:46)
 06-12 18:31:07.100: ERROR/AndroidRuntime(17018):     at  com.db4o.internal.OpenTypeHandler.read(OpenTypeHandler.java:172)
 06-12 18:31:07.100: ERROR/AndroidRuntime(17018):     at  com.db4o.internal.Handlers4.readValueType(Handlers4.java:313)
 06-12 18:31:07.100: ERROR/AndroidRuntime(17018):     at  com.db4o.internal.marshall.AbstractReadContext.readAtCurrentSeekPosition(AbstractReadContext.java:48)
 06-12 18:31:07.100: ERROR/AndroidRuntime(17018):     at  com.db4o.internal.marshall.AbstractReadContext$1.run(AbstractReadContext.java:38)
 06-12 18:31:07.100: ERROR/AndroidRuntime(17018):     at  com.db4o.internal.marshall.SlotFormat.doWithSlotIndirection(SlotFormat.java:64)
 06-12 18:31:07.100: ERROR/AndroidRuntime(17018):     at  com.db4o.internal.marshall.AbstractReadContext.readObject(AbstractReadContext.java:36)
 06-12 18:31:07.100: ERROR/AndroidRuntime(17018):     at  com.db4o.internal.handlers.array.ArrayHandler.readInto(ArrayHandler.java:381)
 06-12 18:31:07.100: ERROR/AndroidRuntime(17018):     at  com.db4o.internal.handlers.array.ArrayHandler.readElements(ArrayHandler.java:363)
 06-12 18:31:07.100: ERROR/AndroidRuntime(17018):     at  com.db4o.internal.handlers.array.ArrayHandler.read(ArrayHandler.java:355)
 06-12 18:31:07.100: ERROR/AndroidRuntime(17018):     at  com.db4o.internal.Handlers4.readValueType(Handlers4.java:313)
 06-12 18:31:07.100: ERROR/AndroidRuntime(17018):     at  com.db4o.internal.marshall.AbstractReadContext.readAtCurrentSeekPosition(AbstractReadContext.java:48)
 06-12 18:31:07.100: ERROR/AndroidRuntime(17018):     at  com.db4o.internal.OpenTypeHandler.read(OpenTypeHandler.java:172)
 06-12 18:31:07.100: ERROR/AndroidRuntime(17018):     at  com.db4o.internal.Handlers4.readValueType(Handlers4.java:313)
 06-12 18:31:07.100: ERROR/AndroidRuntime(17018):     at  com.db4o.internal.marshall.AbstractReadContext.readAtCurrentSeekPosition(AbstractReadContext.java:48)
 06-12 18:31:07.100: ERROR/AndroidRuntime(17018):     at  com.db4o.internal.marshall.AbstractReadContext$1.run(AbstractReadContext.java:38)
 06-12 18:31:07.100: ERROR/AndroidRuntime(17018):     at  com.db4o.internal.marshall.SlotFormat.doWithSlotIndirection(SlotFormat.java:64)
 06-12 18:31:07.100: ERROR/AndroidRuntime(17018):     at  com.db4o.internal.marshall.AbstractReadContext.readObject(AbstractReadContext.java:36)
 06-12 18:31:07.100: ERROR/AndroidRuntime(17018):     at  com.db4o.internal.marshall.AbstractReadContext.read(AbstractReadContext.java:28)
 06-12 18:31:07.100: ERROR/AndroidRuntime(17018):     at  com.db4o.internal.FieldMetadata.read(FieldMetadata.java:811)
 06-12 18:31:07.100: ERROR/AndroidRuntime(17018):     at  com.db4o.internal.FieldMetadata.activate(FieldMetadata.java:646)
 06-12 18:31:07.100: ERROR/AndroidRuntime(17018):     at  com.db4o.internal.handlers.StandardReferenceTypeHandler$2.processAspect(StandardReferenceTypeHandler.java:93)
 06-12 18:31:07.100: ERROR/AndroidRuntime(17018):     at  com.db4o.internal.metadata.MarshallingInfoTraverseAspectCommand.processAspect(MarshallingInfoTraverseAspectCommand.java:52)
 06-12 18:31:07.100: ERROR/AndroidRuntime(17018):     at  com.db4o.internal.metadata.StandardAspectTraversalStrategy.traverseAllAspects(StandardAspectTraversalStrategy.java:24)
 06-12 18:31:07.100: ERROR/AndroidRuntime(17018):     at  com.db4o.internal.ClassMetadata.traverseAllAspects(ClassMetadata.java:2086)
 06-12 18:31:07.100: ERROR/AndroidRuntime(17018):     at  com.db4o.internal.handlers.StandardReferenceTypeHandler.traverseAllAspects(St

After posting on the forums I was given some advice from Fabio (who looks to be an employee). He advised to try the TransparentActivation mechanism. I implemented it on my 6 classes and in the configuration of db4o as shown in an example in the previous link.

Magically, the error went away. So, if you get this error, implement the Activatable interface (or IActivatable in .NET).

NOTE: This could be vastly useful when Windows Phone 7 is released if you’re using it for .NET.