变量在超出范围时是否已取消分配

时间:2013-04-08 17:03:29

标签: scala

鉴于此代码段

def doSomething() = {

    val associations : HashMap[Int, Int] = function_that_create_a_hashmap
    println("something")
}

doSomething终止时,变量associations是否已取消分配?我应该在它上面调用一些析构函数(在这种情况下可能是.clear)还是该操作没用?

3 个答案:

答案 0 :(得分:7)

这不是必要的 - 如果您的应用程序没有更多对HashMap的引用,那么将来会在某个时刻自动收集垃圾。

如果你真的想要摆脱一个巨大的哈希映射以避免其内存消耗在doSomething完成后触发GC周期,你可以调用System.gc(),但这通常都不需要也不是推荐的做法。

答案 1 :(得分:3)

.clear上调用HashMap不会将其从内存中删除;它简单地清除了预先存在的映射,因此对象仍然存在于内存中。

由于Scala在JVM上运行,我认为它将在未来的某个时刻被垃圾收集器收集(假设没有对associations的现有引用)。 JVM管理自己的内存,从而使程序员免于手动管理内存的负担。

答案 2 :(得分:2)

当创建它的作用域不再存在时(当associations的给定调用返回时),绑定doSomething不再存在。这将删除对HashMap的一个引用,并且一旦没有引用,则该值为垃圾并且将来在未指定的时间进行回收(可能永远不会在JVM退出之前)。