summaryrefslogtreecommitdiff
path: root/test/files/run/lambda-serialization-gc.scala
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2015-06-24 15:19:05 +1000
committerJason Zaugg <jzaugg@gmail.com>2015-06-24 18:10:42 +1000
commit1f7417c763fb199cacc6afedc6e54796916fd673 (patch)
treebd00d7e0e47be310172f01c758c01ca5430063c4 /test/files/run/lambda-serialization-gc.scala
parent73f40564a6b19e8b15f0908c3e24f1a8fe405605 (diff)
parent1b09e12ef3b3fea1cab56bac893295f74de23b8b (diff)
downloadscala-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.scala40
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
+ }
+ }
+}