3 Replies Latest reply on Oct 20, 2010 8:56 AM by olegnitz

    OutOfMemoryError

    lawc

      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
          lawc

          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
            yenki

            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
              olegnitz

              Hi,

               

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

              (file JBSER-121.patch)