如何在Scala中使用ClassLoader为对象创建内存沙箱?

时间:2014-03-19 05:02:07

标签: scala classloader urlclassloader

我正在尝试创建一组动态加载的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
}

0 个答案:

没有答案