Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

NullPointerExceptions for tests on Renaissance Suite #5726

Closed
ShishirH opened this issue May 10, 2019 · 7 comments · Fixed by ibmruntimes/openj9-openjdk-jdk11#170
Closed

Comments

@ShishirH
Copy link
Contributor

In the Renaissance Suite, some tests which work as expected on Hotspot and Graal fail on OpenJ9 with a NullPointerException.

The tests that fail are the ones with no results in this image, that is:

  1. als
  2. chi-square
  3. gauss-mix
  4. log-regression
  5. movie-lens
  6. naive-bayes
  7. page-rank

To reproduce:

  • Download the test suite jar file
  • Run the suite, specifying any of the tests above using:
    java -jar renaissance-mit-0.9.0.jar <name_of_test

Taking a closer look at als, one of the tests that failed, the stack trace in the Javacore shows:

4XESTACKTRACE                at org/apache/spark/SparkContext$$anon$2.childValue(SparkContext.scala:336)
4XESTACKTRACE                at org/apache/spark/SparkContext$$anon$2.childValue(SparkContext.scala:332)
4XESTACKTRACE                at java/lang/ThreadLocal$ThreadLocalMap.<init>(ThreadLocal.java:411)
4XESTACKTRACE                at java/lang/ThreadLocal.createInheritedMap(ThreadLocal.java:276)
4XESTACKTRACE                at java/lang/Thread.initialize(Thread.java:378)
4XESTACKTRACE                at java/lang/Thread.<init>(Thread.java:346)
4XESTACKTRACE                at java/lang/Thread.<init>(Thread.java:231)
4XESTACKTRACE                at java/io/ClassCache$Reaper.<init>(ClassCache.java:221)
4XESTACKTRACE                at java/io/ClassCache$CreateReaperAction.run(ClassCache.java:212)
4XESTACKTRACE                at java/io/ClassCache$CreateReaperAction.run(ClassCache.java:201)
4XESTACKTRACE                at java/security/AccessController.doPrivileged(AccessController.java:647)
4XESTACKTRACE                at java/io/ClassCache.<init>(ClassCache.java:67)
4XESTACKTRACE                at java/io/ObjectInputStream.<clinit>(ObjectInputStream.java:335)
4XESTACKTRACE                at org/apache/commons/lang3/SerializationUtils.clone(SerializationUtils.java:88)
4XESTACKTRACE                at org/apache/spark/SparkContext$$anon$2.childValue(SparkContext.scala:336)
4XESTACKTRACE                at org/apache/spark/SparkContext$$anon$2.childValue(SparkContext.scala:332)
4XESTACKTRACE                at java/lang/ThreadLocal$ThreadLocalMap.<init>(ThreadLocal.java:411)
4XESTACKTRACE                at java/lang/ThreadLocal.createInheritedMap(ThreadLocal.java:276)
4XESTACKTRACE                at java/lang/Thread.initialize(Thread.java:378)
4XESTACKTRACE                at java/lang/Thread.<init>(Thread.java:346)
4XESTACKTRACE                at java/lang/Thread.<init>(Thread.java:117)
4XESTACKTRACE                at org/apache/hadoop/util/Shell$1.<init>(Shell.java:427)
4XESTACKTRACE                at org/apache/hadoop/util/Shell.runCommand(Shell.java:427)
4XESTACKTRACE                at org/apache/hadoop/util/Shell.run(Shell.java:379)
4XESTACKTRACE                at org/apache/hadoop/util/Shell$ShellCommandExecutor.execute(Shell.java:589)

All 7 of the tests suffer from NullPointerExceptions, and 6 of them, with the exception of log-regression, with the same failure as above.

log-regression fails with:

Exception occurred in org.renaissance.apache.spark.LogRegression@eeef26b2: assertion failed: no symbol could be loaded from class java.io.ObjectInputStream in package io with name ObjectInputStream and classloader null
java.lang.AssertionError: assertion failed: no symbol could be loaded from class java.io.ObjectInputStream in package io with name ObjectInputStream and classloader null
	at scala.reflect.runtime.JavaMirrors$JavaMirror.scala$reflect$runtime$JavaMirrors$JavaMirror$$classToScala1(JavaMirrors.scala:1021)
	at scala.reflect.runtime.JavaMirrors$JavaMirror$$anonfun$classToScala$1.apply(JavaMirrors.scala:980)
	at scala.reflect.runtime.JavaMirrors$JavaMirror$$anonfun$classToScala$1.apply(JavaMirrors.scala:980)
	at scala.reflect.runtime.JavaMirrors$JavaMirror$$anonfun$toScala$1.apply(JavaMirrors.scala:97)
	at scala.reflect.runtime.TwoWayCaches$TwoWayCache$$anonfun$toScala$1.apply(TwoWayCaches.scala:38)
	at scala.reflect.runtime.Gil$class.gilSynchronized(Gil.scala:19)
	at scala.reflect.runtime.JavaUniverse.gilSynchronized(JavaUniverse.scala:16)
	at scala.reflect.runtime.TwoWayCaches$TwoWayCache.toScala(TwoWayCaches.scala:33)
	at scala.reflect.runtime.JavaMirrors$JavaMirror.toScala(JavaMirrors.scala:95)
	at scala.reflect.runtime.JavaMirrors$JavaMirror.classToScala(JavaMirrors.scala:980)
	at scala.reflect.runtime.JavaMirrors$JavaMirror.typeToScala(JavaMirrors.scala:1085)
	at scala.reflect.runtime.JavaMirrors$JavaMirror$$anonfun$22.apply(JavaMirrors.scala:1158)
	at scala.reflect.runtime.JavaMirrors$JavaMirror$$anonfun$22.apply(JavaMirrors.scala:1158)
	at scala.collection.immutable.List.map(List.scala:273)
	at scala.reflect.runtime.JavaMirrors$JavaMirror.scala$reflect$runtime$JavaMirrors$JavaMirror$$jmethodAsScala1(JavaMirrors.scala:1158)
	at scala.reflect.runtime.JavaMirrors$JavaMirror$$anonfun$scala$reflect$runtime$JavaMirrors$JavaMirror$$jmethodAsScala$1.apply(JavaMirrors.scala:1151)
	at scala.reflect.runtime.JavaMirrors$JavaMirror$$anonfun$scala$reflect$runtime$JavaMirrors$JavaMirror$$jmethodAsScala$1.apply(JavaMirrors.scala:1151)
	at scala.reflect.runtime.JavaMirrors$JavaMirror$$anonfun$toScala$1.apply(JavaMirrors.scala:97)
	at scala.reflect.runtime.TwoWayCaches$TwoWayCache$$anonfun$toScala$1.apply(TwoWayCaches.scala:38)
	at scala.reflect.runtime.Gil$class.gilSynchronized(Gil.scala:19)
	at scala.reflect.runtime.JavaUniverse.gilSynchronized(JavaUniverse.scala:16)
	at scala.reflect.runtime.TwoWayCaches$TwoWayCache.toScala(TwoWayCaches.scala:33)
	at scala.reflect.runtime.JavaMirrors$JavaMirror.toScala(JavaMirrors.scala:95)
	at scala.reflect.runtime.JavaMirrors$JavaMirror.scala$reflect$runtime$JavaMirrors$JavaMirror$$jmethodAsScala(JavaMirrors.scala:1151)
	at scala.reflect.runtime.JavaMirrors$JavaMirror$FromJavaClassCompleter$$anonfun$completeRest$1$$anonfun$apply$mcV$sp$1$$anonfun$apply$mcV$sp$4.apply(JavaMirrors.scala:782)
	at scala.reflect.runtime.JavaMirrors$JavaMirror$FromJavaClassCompleter$$anonfun$completeRest$1$$anonfun$apply$mcV$sp$1$$anonfun$apply$mcV$sp$4.apply(JavaMirrors.scala:782)
	at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33)
	at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:186)
	at scala.reflect.runtime.JavaMirrors$JavaMirror$FromJavaClassCompleter$$anonfun$completeRest$1$$anonfun$apply$mcV$sp$1.apply$mcV$sp(JavaMirrors.scala:782)
	at scala.reflect.runtime.JavaMirrors$JavaMirror$FromJavaClassCompleter$$anonfun$completeRest$1.apply$mcV$sp(JavaMirrors.scala:791)
	at scala.reflect.runtime.JavaMirrors$JavaMirror$FromJavaClassCompleter$$anonfun$completeRest$1.apply(JavaMirrors.scala:749)
	at scala.reflect.runtime.JavaMirrors$JavaMirror$FromJavaClassCompleter$$anonfun$completeRest$1.apply(JavaMirrors.scala:749)
	at scala.reflect.runtime.Gil$class.gilSynchronized(Gil.scala:19)
	at scala.reflect.runtime.JavaUniverse.gilSynchronized(JavaUniverse.scala:16)
	at scala.reflect.runtime.JavaMirrors$JavaMirror$FromJavaClassCompleter.completeRest(JavaMirrors.scala:749)
	at scala.reflect.runtime.JavaMirrors$JavaMirror$FromJavaClassCompleter$LazyPolyType.complete(JavaMirrors.scala:798)
	at scala.reflect.internal.Symbols$Symbol.info(Symbols.scala:1514)
	at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol$$anon$8.scala$reflect$runtime$SynchronizedSymbols$SynchronizedSymbol$$super$info(SynchronizedSymbols.scala:168)
	at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol$$anonfun$info$1.apply(SynchronizedSymbols.scala:127)
	at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol$$anonfun$info$1.apply(SynchronizedSymbols.scala:127)
	at scala.reflect.runtime.Gil$class.gilSynchronized(Gil.scala:19)
	at scala.reflect.runtime.JavaUniverse.gilSynchronized(JavaUniverse.scala:16)
	at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol$class.gilSynchronizedIfNotThreadsafe(SynchronizedSymbols.scala:123)
	at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol$$anon$8.gilSynchronizedIfNotThreadsafe(SynchronizedSymbols.scala:168)
	at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol$class.info(SynchronizedSymbols.scala:127)
	at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol$$anon$8.info(SynchronizedSymbols.scala:168)
	at scala.reflect.internal.Types$TypeRef.thisInfo(Types.scala:2194)
	at scala.reflect.internal.Types$TypeRef.baseClasses(Types.scala:2199)
	at scala.reflect.internal.Types$class.computeBaseClasses(Types.scala:1425)
	at scala.reflect.internal.SymbolTable.computeBaseClasses(SymbolTable.scala:16)
	at scala.reflect.internal.Types$$anonfun$defineBaseClassesOfCompoundType$1.apply(Types.scala:1560)
	at scala.reflect.internal.Types$$anonfun$defineBaseClassesOfCompoundType$1.apply(Types.scala:1560)
	at scala.reflect.internal.Types$CompoundType.updateCache$1(Types.scala:1387)
	at scala.reflect.internal.Types$CompoundType.memo(Types.scala:1396)
	at scala.reflect.internal.Types$class.defineBaseClassesOfCompoundType(Types.scala:1560)
	at scala.reflect.internal.Types$class.define$1(Types.scala:1527)
	at scala.reflect.internal.Types$class.defineBaseClassesOfCompoundType(Types.scala:1528)
	at scala.reflect.runtime.JavaUniverse.scala$reflect$runtime$SynchronizedTypes$$super$defineBaseClassesOfCompoundType(JavaUniverse.scala:16)
	at scala.reflect.runtime.SynchronizedTypes$$anonfun$defineBaseClassesOfCompoundType$1.apply(SynchronizedTypes.scala:101)
	at scala.reflect.runtime.SynchronizedTypes$$anonfun$defineBaseClassesOfCompoundType$1.apply(SynchronizedTypes.scala:101)
	at scala.reflect.runtime.Gil$class.gilSynchronized(Gil.scala:19)
	at scala.reflect.runtime.JavaUniverse.gilSynchronized(JavaUniverse.scala:16)
	at scala.reflect.runtime.SynchronizedTypes$class.defineBaseClassesOfCompoundType(SynchronizedTypes.scala:101)
	at scala.reflect.runtime.JavaUniverse.defineBaseClassesOfCompoundType(JavaUniverse.scala:16)
	at scala.reflect.internal.Types$CompoundType.baseClasses(Types.scala:1370)
	at scala.reflect.internal.Types$TypeRef.baseClasses(Types.scala:2199)
	at scala.reflect.internal.Types$class.computeBaseClasses(Types.scala:1425)
	at scala.reflect.internal.SymbolTable.computeBaseClasses(SymbolTable.scala:16)
	at scala.reflect.internal.Types$$anonfun$defineBaseClassesOfCompoundType$1.apply(Types.scala:1560)
	at scala.reflect.internal.Types$$anonfun$defineBaseClassesOfCompoundType$1.apply(Types.scala:1560)
	at scala.reflect.internal.Types$CompoundType.updateCache$1(Types.scala:1387)
	at scala.reflect.internal.Types$CompoundType.memo(Types.scala:1396)
	at scala.reflect.internal.Types$class.defineBaseClassesOfCompoundType(Types.scala:1560)
	at scala.reflect.internal.Types$class.define$1(Types.scala:1527)
	at scala.reflect.internal.Types$class.defineBaseClassesOfCompoundType(Types.scala:1528)
	at scala.reflect.runtime.JavaUniverse.scala$reflect$runtime$SynchronizedTypes$$super$defineBaseClassesOfCompoundType(JavaUniverse.scala:16)
	at scala.reflect.runtime.SynchronizedTypes$$anonfun$defineBaseClassesOfCompoundType$1.apply(SynchronizedTypes.scala:101)
	at scala.reflect.runtime.SynchronizedTypes$$anonfun$defineBaseClassesOfCompoundType$1.apply(SynchronizedTypes.scala:101)
	at scala.reflect.runtime.Gil$class.gilSynchronized(Gil.scala:19)
	at scala.reflect.runtime.JavaUniverse.gilSynchronized(JavaUniverse.scala:16)
	at scala.reflect.runtime.SynchronizedTypes$class.defineBaseClassesOfCompoundType(SynchronizedTypes.scala:101)
	at scala.reflect.runtime.JavaUniverse.defineBaseClassesOfCompoundType(JavaUniverse.scala:16)
	at scala.reflect.internal.Types$CompoundType.baseClasses(Types.scala:1370)
	at scala.reflect.internal.Types$TypeRef.baseClasses(Types.scala:2199)
	at scala.reflect.internal.Types$TypeRef.baseClasses(Types.scala:2199)
	at scala.reflect.internal.Types$class.computeBaseClasses(Types.scala:1425)
	at scala.reflect.internal.SymbolTable.computeBaseClasses(SymbolTable.scala:16)
	at scala.reflect.internal.Types$$anonfun$defineBaseClassesOfCompoundType$1.apply(Types.scala:1560)
	at scala.reflect.internal.Types$$anonfun$defineBaseClassesOfCompoundType$1.apply(Types.scala:1560)
	at scala.reflect.internal.Types$CompoundType.updateCache$1(Types.scala:1387)
	at scala.reflect.internal.Types$CompoundType.memo(Types.scala:1396)
	at scala.reflect.internal.Types$class.defineBaseClassesOfCompoundType(Types.scala:1560)
	at scala.reflect.internal.Types$class.define$1(Types.scala:1527)
	at scala.reflect.internal.Types$class.defineBaseClassesOfCompoundType(Types.scala:1528)
	at scala.reflect.runtime.JavaUniverse.scala$reflect$runtime$SynchronizedTypes$$super$defineBaseClassesOfCompoundType(JavaUniverse.scala:16)
	at scala.reflect.runtime.SynchronizedTypes$$anonfun$defineBaseClassesOfCompoundType$1.apply(SynchronizedTypes.scala:101)
	at scala.reflect.runtime.SynchronizedTypes$$anonfun$defineBaseClassesOfCompoundType$1.apply(SynchronizedTypes.scala:101)
	at scala.reflect.runtime.Gil$class.gilSynchronized(Gil.scala:19)
	at scala.reflect.runtime.JavaUniverse.gilSynchronized(JavaUniverse.scala:16)
	at scala.reflect.runtime.SynchronizedTypes$class.defineBaseClassesOfCompoundType(SynchronizedTypes.scala:101)
	at scala.reflect.runtime.JavaUniverse.defineBaseClassesOfCompoundType(JavaUniverse.scala:16)
	at scala.reflect.internal.Types$CompoundType.baseClasses(Types.scala:1370)
	at scala.reflect.internal.Types$Type.findDecl(Types.scala:983)
	at scala.reflect.internal.Types$Type.decl(Types.scala:566)
	at scala.reflect.internal.Symbols$ClassSymbol.primaryConstructor(Symbols.scala:3284)
	at scala.reflect.internal.Definitions$DefinitionsClass.UninitializedFieldConstructor$lzycompute(Definitions.scala:316)
	at scala.reflect.internal.Definitions$DefinitionsClass.UninitializedFieldConstructor(Definitions.scala:316)
	at scala.reflect.runtime.JavaUniverseForce$class.force(JavaUniverseForce.scala:228)
	at scala.reflect.runtime.JavaUniverse.force(JavaUniverse.scala:16)
	at scala.reflect.runtime.JavaUniverse.init(JavaUniverse.scala:147)
	at scala.reflect.runtime.JavaUniverse.<init>(JavaUniverse.scala:78)
	at scala.reflect.runtime.package$.universe$lzycompute(package.scala:17)
	at scala.reflect.runtime.package$.universe(package.scala:17)
	at org.renaissance.apache.spark.LogRegression.runIteration(LogRegression.scala:104)
	at org.renaissance.RenaissanceBenchmark.runIterationWithBeforeAndAfter(RenaissanceBenchmark.java:125)
	at org.renaissance.FixedIterationsPolicy.execute(FixedIterationsPolicy.java:48)
	at org.renaissance.RenaissanceBenchmark.runBenchmark(RenaissanceBenchmark.java:86)
	at org.renaissance.RenaissanceSuite$.$anonfun$main$2(renaissance-suite.scala:308)
	at org.renaissance.RenaissanceSuite$.$anonfun$main$2$adapted(renaissance-suite.scala:306)
	at org.renaissance.RenaissanceSuite$$$Lambda$116.00000000C897ACB0.apply(Unknown Source)
	at scala.collection.mutable.ResizableArray.foreach(ResizableArray.scala:62)
	at scala.collection.mutable.ResizableArray.foreach$(ResizableArray.scala:55)
	at scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:49)
	at org.renaissance.RenaissanceSuite$.main(renaissance-suite.scala:306)
	at org.renaissance.RenaissanceSuite.main(renaissance-suite.scala)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.renaissance.Launcher.main(Launcher.java:18)
The following benchmarks failed: log-regression
@ShishirH
Copy link
Contributor Author

ShishirH commented May 10, 2019

Generated dumps using "-Xdump:system+java:events=throw+systhrow,filter=*NullPointerException".

Looked at the corefile view using jdmpview for the thread that threw the exception using !stackslots.

The constructor of ClassLoaderAwareObjectInputStream, SerializationUtils$ClassLoaderAwareObjectInputStream.<init>(Ljava/io/InputStream;Ljava/lang/ClassLoader;)V throws the exception.

Called !j9method on that, and fetched the RAM class from the constant pool in there using !j9constantpool.

Taking a closer look at the static fields in the RAM class in there using !j9statics:

Static fields in org/apache/commons/lang3/SerializationUtils$ClassLoaderAwareObjectInputStream:
	0x0000000002EA9568 primitiveTypes Ljava/util/Map; (!j9romstaticfieldshape 0x00007EFCA240FF90) = !j9object 0x0000000000000000

So seems like the Map primitiveTypes is null.
The instruction 20 below is calling put on a null object. That's causing the NPE.

    6 aload2 
    7 putfield 11 org/apache/commons/lang3/SerializationUtils$ClassLoaderAwareObjectInputStream.classLoader Ljava/lang/ClassLoader;
   10 getstatic 12 org/apache/commons/lang3/SerializationUtils$ClassLoaderAwareObjectInputStream.primitiveTypes Ljava/util/Map;
   13 ldc 1 (java.lang.String) byte
   15 getstatic 13 java/lang/Byte.TYPE Ljava/lang/Class;
   18 invokeinterface2 
   20 invokeinterface 14 java/util/Map.put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;

@ShishirH
Copy link
Contributor Author

ShishirH commented May 10, 2019

The renaissance release uses an earlier version of Apache Commons-Lang. Looking at the class in question, SerializationUtils.java:

Class SerializationUtils has a a static method clone, which makes a new object of the inner class ClassLoaderAwareObjectInputStream, which in turn extends ObjectInputStream.

So when SerializationUtils.clone() is creating a new ClassLoaderAwareObjectInputStream object, its super class static block gets executed first. However, the super class static block is also ending up calling SerializationUtils.clone() as evident by the stack trace:

4XESTACKTRACE                at org/apache/commons/lang3/SerializationUtils$ClassLoaderAwareObjectInputStream.<init>(SerializationUtils.java:300)
4XESTACKTRACE                at org/apache/commons/lang3/SerializationUtils.clone(SerializationUtils.java:88)
4XESTACKTRACE                at org/apache/spark/SparkContext$$anon$2.childValue(SparkContext.scala:336)
4XESTACKTRACE                at org/apache/spark/SparkContext$$anon$2.childValue(SparkContext.scala:332)
4XESTACKTRACE                at java/lang/ThreadLocal$ThreadLocalMap.<init>(ThreadLocal.java:411)
4XESTACKTRACE                at java/lang/ThreadLocal.createInheritedMap(ThreadLocal.java:276)
4XESTACKTRACE                at java/lang/Thread.initialize(Thread.java:378)
4XESTACKTRACE                at java/lang/Thread.<init>(Thread.java:346)
4XESTACKTRACE                at java/lang/Thread.<init>(Thread.java:231)
4XESTACKTRACE                at java/io/ClassCache$Reaper.<init>(ClassCache.java:221)
4XESTACKTRACE                at java/io/ClassCache$CreateReaperAction.run(ClassCache.java:212)
4XESTACKTRACE                at java/io/ClassCache$CreateReaperAction.run(ClassCache.java:201)
4XESTACKTRACE                at java/security/AccessController.doPrivileged(AccessController.java:647)
4XESTACKTRACE                at java/io/ClassCache.<init>(ClassCache.java:67)
4XESTACKTRACE                at java/io/ObjectInputStream.<clinit>(ObjectInputStream.java:335)
4XESTACKTRACE                at org/apache/commons/lang3/SerializationUtils.clone(SerializationUtils.java:88)

So it seems like the static variable primitiveMap in the inner class is never being created.

@JasonFengJ9
Copy link
Member

Will have a look.

@vhotspur
Copy link

Hello from Renaissance team: if we can somehow help with debugging and testing, please, let us know (for completeness we track this here: renaissance-benchmarks/renaissance#131). Thanks!

@JasonFengJ9
Copy link
Member

This problem is due to classCache = (isClassCachingEnabled ? new ClassCache() : null); within https://github.com/ibmruntimes/openj9-openjdk-jdk11/blob/b08f3812627640b336684db431fee56e28d77f1e/src/java.base/share/classes/java/io/ObjectInputStream.java#L335.
Since com.ibm.enableClassCaching is true by default, new ClassCache() is invoked, triggered another call to SerializationUtils.clone() and eventually caused NPE as per comments above.
Setting com.ibm.enableClassCaching to false avoided the NPE.

The solution is to move new ClassCache() out static initialization, and initialize it lazily instead.

@ShishirH
Copy link
Contributor Author

@JasonFengJ9 Isn't ObjectInputStream.java the same for both Hotspot and OpenJ9? Is there a reason why there's an issue with OpenJ9, but not Hotspot?

@JasonFengJ9
Copy link
Member

Isn't ObjectInputStream.java the same for both Hotspot and OpenJ9? Is there a reason why there's an issue with OpenJ9, but not Hotspot?

Not always, that's what github.com/ibmruntimes is for. The difference can be observed via comparison of master and openj9 branches.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

4 participants