-
Bug
-
Resolution: Unresolved
-
P5
-
7, 8, 9
-
generic
-
generic
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.
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.
- relates to
-
JDK-8174814 ObjectStreamClass is "re-throw" the previous OutOfMemoryError even my system recovered.
-
- Open
-