我正在尝试创建一组动态加载的Scala类(和对象),这些类保存在'沙盒中。通过ClassLoader(沙盒中保存的所有内存,资源,线程等)。刷新时,我希望删除类加载器中保存的所有内存/静态对象。具体来说,我不想让任何Scala对象徘徊。
我认为下面的代码应该这样做,但是在刷新之后它没有成功重新加载对象。
(包工)
case class Hello {
println("Hello! "+Bee.howBig)
}
object Bee {
val block = 600000
println("Building...")
val s = k5(0)
println("Built big data!")
def howBig = s.size
def k5(startFrom:Int) = (for(x <- startFrom to (startFrom+block)) yield { (x,java.util.UUID.randomUUID.toString) }).toList
}
(包主)
import worker.Bee
import java.net.URLClassLoader
import java.io._
object Main extends App {
println("Starting up!")
var classLoader = new java.net.URLClassLoader(
Array(new File("worker.jar").toURI.toURL),
null) // no parent to make it a sandbox (is this right?)
var helloClass = classLoader.loadClass("worker.Hello")// + "$")
var hello = helloClass.newInstance
// This works...I get the output indicating Bee's data has been created
println("\nand again...")
classLoader = null // force the point--refresh here! hello/bee should be freed
classLoader = new java.net.URLClassLoader(
Array(new File("worker.jar").toURI.toURL),
null)
var helloClass2 = classLoader.loadClass("worker.Hello")// + "$")
hello = helloClass2.newInstance
// This hangs. Output's "Building..." and nothing else...like it ran out
// of memory or something...makes me wonder if resources from first CL were
// ever really dropped
}