3 Replies Latest reply: Oct 20, 2010 8:56 AM by Oleg Nitz RSS

OutOfMemoryError

Helmien Steyn Newbie

Hi,

I get the following exception when serializing/deserializing an object of type: javax.management.openmbean.OpenType,


Type: java.lang.OutOfMemoryError
Message: Java heap space
Stack trace:
at java.lang.AbstractStringBuilder.<init>(AbstractStringBuilder.java:45)
at java.lang.StringBuffer.<init>(StringBuffer.java:91)
at org.jboss.serial.util.StringUtil.readString(StringUtil.java:295)
at org.jboss.serial.objectmetamodel.DataContainer$DataContainerDirectInput.readUTF(DataContainer.java:757)
at org.jboss.serial.persister.ObjectInputStreamProxy.readUTF(ObjectInputStreamProxy.java:196)
at org.jboss.serial.objectmetamodel.FieldsContainer.readField(FieldsContainer.java:147)
at org.jboss.serial.objectmetamodel.FieldsContainer.readMyself(FieldsContainer.java:218)
at org.jboss.serial.persister.ObjectInputStreamProxy.readFields(ObjectInputStreamProxy.java:224)
at javax.management.openmbean.OpenType.readObject(OpenType.java:378)
at sun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethodAccessorImpl.java:1)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.jboss.serial.persister.RegularObjectPersister.readSlotWithMethod(RegularObjectPersister.java:103)
at org.jboss.serial.persister.RegularObjectPersister.defaultRead(RegularObjectPersister.java:269)
at org.jboss.serial.persister.RegularObjectPersister.readData(RegularObjectPersister.java:241)
at org.jboss.serial.objectmetamodel.ObjectDescriptorFactory.readObjectDescriptionFromStreaming(ObjectDescriptorFactory.java:412)
at org.jboss.serial.objectmetamodel.ObjectDescriptorFactory.objectFromDescription(ObjectDescriptorFactory.java:82)
at org.jboss.serial.objectmetamodel.DataContainer$DataContainerDirectInput.readObject(DataContainer.java:643)
at org.jboss.serial.persister.RegularObjectPersister.readSlotWithFields(RegularObjectPersister.java:353)
at org.jboss.serial.persister.ObjectInputStreamProxy.defaultReadObject(ObjectInputStreamProxy.java:78)
at alchemy.mx.mbean.SimpleTabularDataSupport.readObject(SimpleTabularDataSupport.java:971)
at sun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethodAccessorImpl.java:1)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.jboss.serial.persister.RegularObjectPersister.readSlotWithMethod(RegularObjectPersister.java:103)
at org.jboss.serial.persister.RegularObjectPersister.defaultRead(RegularObjectPersister.java:269)
at org.jboss.serial.persister.RegularObjectPersister.readData(RegularObjectPersister.java:241)
at org.jboss.serial.objectmetamodel.ObjectDescriptorFactory.readObjectDescriptionFromStreaming(ObjectDescriptorFactory.java:412)
at org.jboss.serial.objectmetamodel.ObjectDescriptorFactory.objectFromDescription(ObjectDescriptorFactory.java:82)
at org.jboss.serial.objectmetamodel.DataContainer$DataContainerDirectInput.readObject(DataContainer.java:643)


The code fails in StringUtil.readString(DataInput, StringUtilBuffer) method when it tries to instantiate a StringBuffer:

if (strbuffer==null)
{
 strbuffer = new StringBuffer((int)size);
}


The size variable at this stage has a value of 42238343537016.

I am trying to write a test case to reproduce the error, but my test code gives a different exception:

 OpenType[] itemTypes = new OpenType[] { SimpleType.STRING,
 SimpleType.STRING, SimpleType.STRING };
 String[] itemNames = new String[] { "Item1", "Item2", "Item3" };
 String[] itemDescriptions = new String[] { "Item 1", "Item 2", "Item 3" };
 CompositeType rowType = new CompositeType("composite", "Description",
 itemNames, itemDescriptions, itemTypes);

 ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
 JBossObjectOutputStream os = new JBossObjectOutputStream(byteOut);
 os.writeObject(rowType);
 os.flush();

 ByteArrayInputStream byteInpt = new ByteArrayInputStream(byteOut
 .toByteArray());
 JBossObjectInputStream is = new JBossObjectInputStream(byteInpt);
 rowType = (CompositeType) is.readObject();


Exception:


java.io.IOException
at org.jboss.serial.persister.RegularObjectPersister.readSlotWithMethod(RegularObjectPersister.java:107)
at org.jboss.serial.persister.RegularObjectPersister.defaultRead(RegularObjectPersister.java:269)
at org.jboss.serial.persister.RegularObjectPersister.readData(RegularObjectPersister.java:241)
at org.jboss.serial.objectmetamodel.ObjectDescriptorFactory.readObjectDescriptionFromStreaming(ObjectDescriptorFactory.java:412)
at org.jboss.serial.objectmetamodel.ObjectDescriptorFactory.objectFromDescription(ObjectDescriptorFactory.java:82)
at org.jboss.serial.objectmetamodel.DataContainer$DataContainerDirectInput.readObject(DataContainer.java:643)
at org.jboss.serial.io.JBossObjectInputStream.readObjectOverride(JBossObjectInputStream.java:163)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:345)
at alchemy.measure.TestInterfaces.testSerialization(TestInterfaces.java:90)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at junit.framework.TestCase.runTest(TestCase.java:168)
at junit.framework.TestCase.runBare(TestCase.java:134)
at junit.framework.TestResult$1.protect(TestResult.java:110)
at junit.framework.TestResult.runProtected(TestResult.java:128)
at junit.framework.TestResult.run(TestResult.java:113)
at junit.framework.TestCase.run(TestCase.java:124)
at junit.framework.TestSuite.runTest(TestSuite.java:232)
at junit.framework.TestSuite.run(TestSuite.java:227)
at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:81)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:45)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.jboss.serial.persister.RegularObjectPersister.readSlotWithMethod(RegularObjectPersister.java:103)
... 27 more
Caused by: java.io.EOFException
at java.io.DataInputStream.readFully(DataInputStream.java:180)
at org.jboss.serial.util.StringUtil.pullDataToBuffer(StringUtil.java:191)
at org.jboss.serial.util.StringUtil.readString(StringUtil.java:238)
at org.jboss.serial.objectmetamodel.DataContainer$DataContainerDirectInput.readUTF(DataContainer.java:757)
at org.jboss.serial.persister.ObjectInputStreamProxy.readUTF(ObjectInputStreamProxy.java:196)
at org.jboss.serial.objectmetamodel.FieldsContainer.readField(FieldsContainer.java:147)
at org.jboss.serial.objectmetamodel.FieldsContainer.readMyself(FieldsContainer.java:218)
at org.jboss.serial.persister.ObjectInputStreamProxy.readFields(ObjectInputStreamProxy.java:224)
at javax.management.openmbean.OpenType.readObject(OpenType.java:378)
... 32 more


  • 1. Re: OutOfMemoryError
    Helmien Steyn Newbie

    I've traced the second exception to the readObject method of javax.management.openmbean.OpenType. The method has the following line:

    ObjectInputStream.GetField fields = in.readFields();


    The class below gives the same exception when trying to deserialize:

    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.Serializable;
    
    public class MyObject implements Serializable {
    
     private String name;
    
     public MyObject() {
     this.name = "Test";
     }
    
     private void readObject(ObjectInputStream in) throws IOException,
     ClassNotFoundException {
     ObjectInputStream.GetField fields = in.readFields();
     String name = (String) fields.get("name", null);
     }
    }


  • 2. Re: OutOfMemoryError
    Yannick Boucher Newbie

    Hi,

     

    We are experiencing a similar problem and we also found the source to be the invocation of the readFields() method. We found it while trying to move to java 6. Between java 5 and 6 the implementation of java.io.File changed to use readFields(). As a result, every serialization of a java.io.File object fails in java 6. Is it a known issue? It there any plan to fix it?

     

    Thanks

  • 3. Re: OutOfMemoryError
    Oleg Nitz Newbie

    Hi,

     

    I think I've fixed the bug, please find my patch here: https://jira.jboss.org/browse/JBSER-121

    (file JBSER-121.patch)