Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8065563

ObjectStreamClass.lookup caches OutOfMemoryError

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Unresolved
    • Icon: P5 P5
    • tbd
    • 7, 8, 9
    • core-libs

      FULL PRODUCT VERSION :
      Java(TM) SE Runtime Environment (build 1.7.0_60-b19)

      ADDITIONAL OS VERSION INFORMATION :
       2.6.32-431.23.3.el6.x86_64 #1 SMP Wed Jul 16 06:12:23 EDT 2014 x86_64 x86_64 x86_64 GNU/Linux
      Windows 7

      A DESCRIPTION OF THE PROBLEM :
      The method static ObjectStreamClass lookup(Class<?> cl, boolean all) {
      caches results also when the result is a Throwable. In our case there was a temporary problem with OutOfMemoryError (which probably also caused the "correct" soft-references in this cache to be cleared), and one lookup failed because of this:
      java.lang.OutOfMemoryError: Java heap space
      at java.lang.Class.getDeclaredMethods0(Native Method)
      at java.lang.Class.privateGetDeclaredMethods(Class.java:2427)
      at java.lang.Class.getDeclaredMethod(Class.java:1935)
      at java.io.ObjectStreamClass.getPrivateMethod(ObjectStreamClass.java:1382)
      at java.io.ObjectStreamClass.access$1700(ObjectStreamClass.java:52)
      at java.io.ObjectStreamClass$2.run(ObjectStreamClass.java:438)
      at java.security.AccessController.doPrivileged(Native Method)
      at java.io.ObjectStreamClass.<init>(ObjectStreamClass.java:413)
      at java.io.ObjectStreamClass.lookup(ObjectStreamClass.java:310)


      It turns out that Throwables as results are ALSO cached (line 366 in ObjectStreamClass), which means that even after our heap was cleared, all later attempts at serializing a specific class caused the old, now cached, OOM to be rethrown (line 382).

      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :

      A bit hard to reproduce, as you need a lot of luck to make the lookup fail with an OOM.

      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -

      OutOfMemoryError (and possibly also other Errors) should probably not be cached here. I suggest to change line 382:

       } catch (Throwable th) {

      into

      }catch (Exception e){

      ERROR MESSAGES/STACK TRACES THAT OCCUR :
      java.lang.OutOfMemoryError: Java heap space
      at java.lang.Class.getDeclaredMethods0(Native Method)
      at java.lang.Class.privateGetDeclaredMethods(Class.java:2427)
      at java.lang.Class.getDeclaredMethod(Class.java:1935)
      at java.io.ObjectStreamClass.getPrivateMethod(ObjectStreamClass.java:1382)
      at java.io.ObjectStreamClass.access$1700(ObjectStreamClass.java:52)
      at java.io.ObjectStreamClass$2.run(ObjectStreamClass.java:438)
      at java.security.AccessController.doPrivileged(Native Method)
      at java.io.ObjectStreamClass.<init>(ObjectStreamClass.java:413)
      at java.io.ObjectStreamClass.lookup(ObjectStreamClass.java:310)
      at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1106)
      at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1338)
      at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1146)
      at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1509)
      at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1474)
      at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392)
      at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)
      at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326)
      at org.apache.wicket.serialize.java.JavaSerializer$SerializationCheckerObjectOutputStream.writeObjectOverride(JavaSerializer.java:260)
      at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:322)
      at org.apache.wicket.serialize.java.JavaSerializer.serialize(JavaSerializer.java:78)
      at org.apache.wicket.pageStore.DefaultPageStore.serializePage(DefaultPageStore.java:376)
      at org.apache.wicket.pageStore.DefaultPageStore.storePage(DefaultPageStore.java:150)
      at org.apache.wicket.page.PageStoreManager$PersistentRequestAdapter.storeTouchedPages(PageStoreManager.java:410)
      at org.apache.wicket.page.RequestAdapter.commitRequest(RequestAdapter.java:181)
      at org.apache.wicket.page.AbstractPageManager.commitRequest(AbstractPageManager.java:98)
      at org.apache.wicket.page.PageManagerDecorator.commitRequest(PageManagerDecorator.java:73)
      at org.apache.wicket.page.PageAccessSynchronizer$2.commitRequest(PageAccessSynchronizer.java:258)
      at org.apache.wicket.Application$2.onDetach(Application.java:1628)
      at org.apache.wicket.request.cycle.RequestCycleListenerCollection$3.notify(RequestCycleListenerCollection.java:105)
      at org.apache.wicket.request.cycle.RequestCycleListenerCollection$3.notify(RequestCycleListenerCollection.java:101)
      at org.apache.wicket.util.listener.ListenerCollection$1.notify(ListenerCollection.java:120)
      at org.apache.wicket.util.listener.ListenerCollection.reversedNotify(ListenerCollection.java:144)

      REPRODUCIBILITY :
      This bug can be reproduced always.

      CUSTOMER SUBMITTED WORKAROUND :

      Restart VM.

            bchristi Brent Christian
            webbuggrp Webbug Group
            Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

              Created:
              Updated: