鉴于此代码段
def doSomething() = {
val associations : HashMap[Int, Int] = function_that_create_a_hashmap
println("something")
}
当doSomething
终止时,变量associations
是否已取消分配?我应该在它上面调用一些析构函数(在这种情况下可能是.clear
)还是该操作没用?
答案 0 :(得分:7)
这不是必要的 - 如果您的应用程序没有更多对HashMap
的引用,那么将来会在某个时刻自动收集垃圾。
如果你真的想要摆脱一个巨大的哈希映射以避免其内存消耗在doSomething
完成后触发GC周期,你可以调用System.gc()
,但这通常都不需要也不是推荐的做法。
答案 1 :(得分:3)
在.clear
上调用HashMap
不会将其从内存中删除;它简单地清除了预先存在的映射,因此对象仍然存在于内存中。
由于Scala在JVM上运行,我认为它将在未来的某个时刻被垃圾收集器收集(假设没有对associations
的现有引用)。 JVM管理自己的内存,从而使程序员免于手动管理内存的负担。
答案 2 :(得分:2)
当创建它的作用域不再存在时(当associations
的给定调用返回时),绑定doSomething
不再存在。这将删除对HashMap
的一个引用,并且一旦没有引用,则该值为垃圾并且将来在未指定的时间进行回收(可能永远不会在JVM退出之前)。