diff options
author | Jason Zaugg <jzaugg@gmail.com> | 2015-06-24 15:19:05 +1000 |
---|---|---|
committer | Jason Zaugg <jzaugg@gmail.com> | 2015-06-24 18:10:42 +1000 |
commit | 1f7417c763fb199cacc6afedc6e54796916fd673 (patch) | |
tree | bd00d7e0e47be310172f01c758c01ca5430063c4 /test/files/run/lambda-serialization-gc.scala | |
parent | 73f40564a6b19e8b15f0908c3e24f1a8fe405605 (diff) | |
parent | 1b09e12ef3b3fea1cab56bac893295f74de23b8b (diff) | |
download | scala-1f7417c763fb199cacc6afedc6e54796916fd673.tar.gz scala-1f7417c763fb199cacc6afedc6e54796916fd673.tar.bz2 scala-1f7417c763fb199cacc6afedc6e54796916fd673.zip |
Merge branch '2.11.x' into merge/2.11.x-to-2.12.x-20150624
Diffstat (limited to 'test/files/run/lambda-serialization-gc.scala')
-rw-r--r-- | test/files/run/lambda-serialization-gc.scala | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/test/files/run/lambda-serialization-gc.scala b/test/files/run/lambda-serialization-gc.scala new file mode 100644 index 0000000000..8fa0b4b402 --- /dev/null +++ b/test/files/run/lambda-serialization-gc.scala @@ -0,0 +1,40 @@ +import java.io._ + +import java.net.URLClassLoader + +class C { + def serializeDeserialize[T <: AnyRef](obj: T) = { + val buffer = new ByteArrayOutputStream + val out = new ObjectOutputStream(buffer) + out.writeObject(obj) + val in = new ObjectInputStream(new ByteArrayInputStream(buffer.toByteArray)) + in.readObject.asInstanceOf[T] + } + + serializeDeserialize((c: String) => c.length) +} + +object Test { + def main(args: Array[String]): Unit = { + test() + } + + def test(): Unit = { + val loader = getClass.getClassLoader.asInstanceOf[URLClassLoader] + val loaderCClass = classOf[C] + def deserializedInThrowawayClassloader = { + val throwawayLoader: java.net.URLClassLoader = new java.net.URLClassLoader(loader.getURLs, ClassLoader.getSystemClassLoader) { + val maxMemory = Runtime.getRuntime.maxMemory() + val junk = new Array[Byte]((maxMemory / 2).toInt) + } + val clazz = throwawayLoader.loadClass("C") + assert(clazz != loaderCClass) + clazz.newInstance() + } + (1 to 4) foreach { i => + // This would OOM by the third iteration if we leaked `throwawayLoader` during + // deserialization. + deserializedInThrowawayClassloader + } + } +} |