This Bugzilla instance is deprecated, and most Eclipse projects now use GitHub or Eclipse GitLab. Please see the deprecation plan for details.
Bug 310662 - JPA: StackOverflowError on recursive WriteObjectQuery() persisting closed ring of 64 bidirectionally (160) linked entities (32 entities with 64 links is OK)
Summary: JPA: StackOverflowError on recursive WriteObjectQuery() persisting closed rin...
Status: RESOLVED FIXED
Alias: None
Product: z_Archived
Classification: Eclipse Foundation
Component: Eclipselink (show other bugs)
Version: unspecified   Edit
Hardware: PC Windows 7
: P3 normal (vote)
Target Milestone: ---   Edit
Assignee: Nobody - feel free to take it CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2010-04-27 12:32 EDT by Michael OBrien CLA
Modified: 2022-06-09 10:29 EDT (History)
2 users (show)

See Also:


Attachments
JPA SE reproduction of StackOverflowError on persist recursion (109.42 KB, patch)
2010-04-27 12:34 EDT, Michael OBrien CLA
no flags Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Michael OBrien CLA 2010-04-27 12:32:12 EDT
>Stack overflow for the 3rd recursive step when persisting 128 bidirectionally linked entities in a closed ring
>Note: reducing the ring to 64 entities works fine for the following memory size
-Xmx1024m
-Xms1024m
-XX:+UseParallelGC
-XX:PermSize=256M
-XX:MaxPermSize=512M

(64 bit Eclipse 3.5)
org.eclipse.platform
--launcher.XXMaxPermSize
512m
-vmargs
-Xms40m
-Xmx512m

(32 bit Eclipse 3.5 SR2)
--launcher.XXMaxPermSize
512M
-Xms1024m
-Xmx1024m

>tried -Xss40m (anything bigger than 256 on 32 bit gets...)
Error occurred during initialization of VM
Could not reserve enough space for object heap


>stacktrace 
[EL Finest]: 2010-04-27 12:05:56.033--UnitOfWork(11601738)--Thread(Thread[main,5,main])--Execute query WriteObjectQuery(ProcessingUnit@12039161[0:0])
[EL Finest]: 2010-04-27 12:05:56.033--UnitOfWork(11601738)--Thread(Thread[main,5,main])--Execute query WriteObjectQuery([0000])
[EL Finest]: 2010-04-27 12:05:56.033--UnitOfWork(11601738)--Thread(Thread[main,5,main])--Execute query WriteObjectQuery(ProcessingUnit@8970080[0:0])
[EL Finest]: 2010-04-27 12:05:56.033--UnitOfWork(11601738)--Thread(Thread[main,5,main])--Execute query WriteObjectQuery([0000])
[EL Finest]: 2010-04-27 12:05:56.033--UnitOfWork(11601738)--Thread(Thread[main,5,main])--Execute query WriteObjectQuery(ProcessingUnit@78219[0:0])
Exception in thread "main" java.lang.StackOverflowError
	at java.util.ResourceBundle.findBundle(ResourceBundle.java:1289)
	at java.util.ResourceBundle.findBundle(ResourceBundle.java:1292)
	at java.util.ResourceBundle.findBundle(ResourceBundle.java:1292)
	at java.util.ResourceBundle.getBundleImpl(ResourceBundle.java:1234)
	at java.util.ResourceBundle.getBundle(ResourceBundle.java:787)
	at org.eclipse.persistence.internal.localization.EclipseLinkLocalization.buildMessage(EclipseLinkLocalization.java:60)
	at org.eclipse.persistence.internal.localization.TraceLocalization.buildMessage(TraceLocalization.java:30)
	at org.eclipse.persistence.logging.AbstractSessionLog.formatMessage(AbstractSessionLog.java:801)
	at org.eclipse.persistence.logging.DefaultSessionLog.log(DefaultSessionLog.java:156)
	at org.eclipse.persistence.internal.sessions.AbstractSession.log(AbstractSession.java:2585)
	at org.eclipse.persistence.internal.sessions.AbstractSession.log(AbstractSession.java:3678)
	at org.eclipse.persistence.internal.sessions.AbstractSession.log(AbstractSession.java:3650)
	at org.eclipse.persistence.internal.sessions.AbstractSession.log(AbstractSession.java:3626)
	at org.eclipse.persistence.internal.sessions.AbstractSession.log(AbstractSession.java:3548)
	at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1201)
	at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.executeQuery(UnitOfWorkImpl.java:1856)
	at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1167)
	at org.eclipse.persistence.mappings.ObjectReferenceMapping.insert(ObjectReferenceMapping.java:972)
	at org.eclipse.persistence.mappings.ObjectReferenceMapping.preInsert(ObjectReferenceMapping.java:495)
	at org.eclipse.persistence.descriptors.DescriptorQueryManager.preInsert(DescriptorQueryManager.java:998)
	at org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.insertObjectForWrite(DatabaseQueryMechanism.java:411)
	at org.eclipse.persistence.queries.InsertObjectQuery.executeCommit(InsertObjectQuery.java:80)
	at org.eclipse.persistence.queries.InsertObjectQuery.executeCommitWithChangeSet(InsertObjectQuery.java:90)
	at org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.performUserDefinedWrite(DatabaseQueryMechanism.java:543)
	at org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.performUserDefinedInsert(DatabaseQueryMechanism.java:511)
	at org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.insertObjectForWrite(DatabaseQueryMechanism.java:388)
	at org.eclipse.persistence.queries.WriteObjectQuery.executeCommitWithChangeSet(WriteObjectQuery.java:121)
	at org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.executeWriteWithChangeSet(DatabaseQueryMechanism.java:282)
	at org.eclipse.persistence.queries.WriteObjectQuery.executeDatabaseQuery(WriteObjectQuery.java:58)
	at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:730)
	at org.eclipse.persistence.queries.DatabaseQuery.executeInUnitOfWork(DatabaseQuery.java:637)
	at org.eclipse.persistence.queries.ObjectLevelModifyQuery.executeInUnitOfWorkObjectLevelModifyQuery(ObjectLevelModifyQuery.java:108)
	at org.eclipse.persistence.queries.ObjectLevelModifyQuery.executeInUnitOfWork(ObjectLevelModifyQuery.java:85)
	at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2914)
	at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1225)
	at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1207)
	at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.executeQuery(UnitOfWorkImpl.java:1856)
	at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1167)
	at org.eclipse.persistence.mappings.ObjectReferenceMapping.insert(ObjectReferenceMapping.java:972)
	at org.eclipse.persistence.mappings.ObjectReferenceMapping.preInsert(ObjectReferenceMapping.java:495)
	at org.eclipse.persistence.descriptors.DescriptorQueryManager.preInsert(DescriptorQueryManager.java:998)
	at org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.insertObjectForWrite(DatabaseQueryMechanism.java:411)
	at org.eclipse.persistence.queries.InsertObjectQuery.executeCommit(InsertObjectQuery.java:80)
	at org.eclipse.persistence.queries.InsertObjectQuery.executeCommitWithChangeSet(InsertObjectQuery.java:90)
	at org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.performUserDefinedWrite(DatabaseQueryMechanism.java:543)
	at org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.performUserDefinedInsert(DatabaseQueryMechanism.java:511)
	at org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.insertObjectForWrite(DatabaseQueryMechanism.java:388)
	at org.eclipse.persistence.queries.WriteObjectQuery.executeCommitWithChangeSet(WriteObjectQuery.java:121)
	at org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.executeWriteWithChangeSet(DatabaseQueryMechanism.java:282)
	at org.eclipse.persistence.queries.WriteObjectQuery.executeDatabaseQuery(WriteObjectQuery.java:58)
	at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:730)
	at org.eclipse.persistence.queries.DatabaseQuery.executeInUnitOfWork(DatabaseQuery.java:637)
	at org.eclipse.persistence.queries.ObjectLevelModifyQuery.executeInUnitOfWorkObjectLevelModifyQuery(ObjectLevelModifyQuery.java:108)
	at org.eclipse.persistence.queries.ObjectLevelModifyQuery.executeInUnitOfWork(ObjectLevelModifyQuery.java:85)
	at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2914)
	at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1225)
	at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1207)
...


>With logging defaulted to INFO/Warning we get the same recursion stack overflow - without the exception message

_created 160 links between 64 routers

[                                                                                                                                                                                             1                                                                  ] iter: 1 time: 385Exception in thread "main" java.lang.StackOverflowError
	at org.eclipse.persistence.queries.DatabaseQuery.checkForCustomQuery(DatabaseQuery.java:461)
	at org.eclipse.persistence.queries.DatabaseQuery.checkPrepare(DatabaseQuery.java:485)
	at org.eclipse.persistence.queries.DatabaseQuery.checkPrepare(DatabaseQuery.java:470)
	at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:700)
	at org.eclipse.persistence.queries.DatabaseQuery.executeInUnitOfWork(DatabaseQuery.java:637)
	at org.eclipse.persistence.queries.ObjectLevelModifyQuery.executeInUnitOfWorkObjectLevelModifyQuery(ObjectLevelModifyQuery.java:108)
	at org.eclipse.persistence.queries.ObjectLevelModifyQuery.executeInUnitOfWork(ObjectLevelModifyQuery.java:85)
	at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2914)
	at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1225)
	at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1207)
	at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.executeQuery(UnitOfWorkImpl.java:1856)
	at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1167)
	at org.eclipse.persistence.mappings.ObjectReferenceMapping.insert(ObjectReferenceMapping.java:972)
	at org.eclipse.persistence.mappings.ObjectReferenceMapping.preInsert(ObjectReferenceMapping.java:495)
	at org.eclipse.persistence.descriptors.DescriptorQueryManager.preInsert(DescriptorQueryManager.java:998)
	at org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.insertObjectForWrite(DatabaseQueryMechanism.java:411)
	at org.eclipse.persistence.queries.InsertObjectQuery.executeCommit(InsertObjectQuery.java:80)
	at org.eclipse.persistence.queries.InsertObjectQuery.executeCommitWithChangeSet(InsertObjectQuery.java:90)
	at org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.performUserDefinedWrite(DatabaseQueryMechanism.java:543)
	at org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.performUserDefinedInsert(DatabaseQueryMechanism.java:511)
	at org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.insertObjectForWrite(DatabaseQueryMechanism.java:388)
	at org.eclipse.persistence.queries.WriteObjectQuery.executeCommitWithChangeSet(WriteObjectQuery.java:121)
	at org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.executeWriteWithChangeSet(DatabaseQueryMechanism.java:282)
	at org.eclipse.persistence.queries.WriteObjectQuery.executeDatabaseQuery(WriteObjectQuery.java:58)
	at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:730)
	at org.eclipse.persistence.queries.DatabaseQuery.executeInUnitOfWork(DatabaseQuery.java:637)
	at org.eclipse.persistence.queries.ObjectLevelModifyQuery.executeInUnitOfWorkObjectLevelModifyQuery(ObjectLevelModifyQuery.java:108)
	at org.eclipse.persistence.queries.ObjectLevelModifyQuery.executeInUnitOfWork(ObjectLevelModifyQuery.java:85)
	at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2914)
	at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1225)
	at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1207)
Comment 1 Michael OBrien CLA 2010-04-27 12:34:23 EDT
Created attachment 166217 [details]
JPA SE reproduction of StackOverflowError on persist recursion

>I am trying different configurations of stack allocation JVM parameters
Comment 2 Michael OBrien CLA 2010-04-27 16:00:47 EDT
>fix is to increase the native stack and java stack per thread size from the default of ? to 42 (unable to use 45+ on a 32 bit JVM)

>use
--------------
-Xss42m
-Xoss42m

>This solves the stack overflow issue during persisting the ring of entities up to a 12 dimensional hypercube (aka Oracle/TM CM-1/2)
- instead of failing at at a ringed cube of 64 entities we are good to 4096 entities
_created 2 links between 2 routers in the 1 dimensional HyperCube.
Total time: 0.15 sec @ 6.666666666666667 iter/sec
_created 8 links between 4 routers in the 2 dimensional HyperCube.
Total time: 0.36 sec @ 2.7777777777777777 iter/sec
_created 24 links between 8 routers in the 3 dimensional HyperCube.
Total time: 0.27 sec @ 3.7037037037037033 iter/sec
_created 64 links between 16 routers in the 4 dimensional HyperCube.
Total time: 0.52 sec @ 1.923076923076923 iter/sec
_created 160 links between 32 routers in the 5 dimensional HyperCube.
Total time: 0.85 sec @ 1.1764705882352942 iter/sec
_created 384 links between 64 routers in the 6 dimensional HyperCube.
Total time: 1.87 sec @ 0.53475935828877 iter/sec
_created 896 links between 128 routers in the 7 dimensional HyperCube.
Total time: 3.45 sec @ 0.2898550724637681 iter/sec
_created 2048 links between 256 routers in the 8 dimensional HyperCube.
Total time: 7.14 sec @ 0.1400560224089636 iter/sec
_created 4608 links between 512 routers in the 9 dimensional HyperCube.
Total time: 13.84 sec @ 0.07225433526011561 iter/sec
_created 10240 links between 1024 routers in the 10 dimensional HyperCube.
Total time: 41.01 sec @ 0.0243842965130456 iter/sec
_created 22528 links between 2048 routers in the 11 dimensional HyperCube.
Total time: 114.101 sec @ 0.00876416508181348 iter/sec
_created 49152 links between 4096 routers in the 12 dimensional HyperCube.
Total time: 414.411 sec @ 0.0024130633598046384 iter/sec
_created 106496 links between 8192 routers in the 13 dimensional HyperCube.
Exception in thread "main" java.lang.StackOverflowError
	at org.eclipse.persistence.queries.DatabaseQuery.checkPrepare(DatabaseQuery.java:470)

>We also will eventually 2nd wall of actual object memory storage of 1.6GB for the 32 bit version anyway at dimension 19 or 512K entities.

>Running on a 64 bit JVM uses up to 3.2Gb of ram and has the same heap profile except for the fact that all words are length doubled (32-64)
>need to verify what both the SUN and EclipseLink PerformanceProfiler have to say.
Comment 3 Eclipse Webmaster CLA 2022-06-09 10:29:54 EDT
The Eclipselink project has moved to Github: https://github.com/eclipse-ee4j/eclipselink