gpt4 book ai didi

scala - 闭包中的对象生命周期

转载 作者:行者123 更新时间:2023-12-01 23:37:50 25 4
gpt4 key购买 nike

假设一个闭包已经在 J​​VM 中运行并在这个闭包的范围内创建了一个对象,这个对象在闭包执行后是否仍然保留在 JVM 堆空间中而 JVM 没有终止?

一旦情况在 Spark 中我使用下面的代码在执行程序中创建 HBase 连接:

rdd.foreachPartition(par => {

# create a connection here.
val connection = ConnectionFactory.createConnection(conf)

par.foreach(item => {
...
})

# close this connection.
connection.close()
})

显然,在执行程序中创建了连接。

  • 在这个任务完成后,如果我没有关闭这个连接,会发生什么?

  • 如果 spark 推测在连接处于事件状态时终止了此任务怎么办? JVM 仍会保持连接吗?

最佳答案

我认为这不是专门针对 Spark,而是一般的 JVM。

首先,在函数范围内创建的变量只不过是一个局部变量。因此在范围结束后,该局部变量没有引用并且符合 GC 的条件。因此,在您的特定情况下,如果您的 connection 项目没有正确调用 close() (可能是由于两者之间发生了一些异常), connection 对象被 GC 收集,但连接本身并未关闭。我们称这种情况为连接泄漏。

处理此问题的最佳做法之一是确保通过 try...finally 关闭每个连接,Java8 有一个简写调用 try-with-resource。对于 Scala,可以创建等效结构,请参阅 this post了解更多详情/经验教训。

最后一个问题,

What if spark speculation kills this task while connection is active? will connection is still being held by JVM?

JVM 将不再适本地保持连接。当这个连接没有被一个对等点明确关闭时,另一个对等点(服务器端)不知道它是否应该相应地关闭它,直到某个空闲超时。无论如何,try finally 可以涵盖所有情况,以确保正确清理所有连接。

关于scala - 闭包中的对象生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50549478/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com