Я предполагаю, что это не относится только к Spark, но в целом к JVM.
Прежде всего, переменная, созданная внутри области действия функции, является не чем иным, как локальной переменной.Следовательно, после окончания области действия эта локальная переменная не имеет ссылки и имеет право на сборщик мусора.Таким образом, в вашем конкретном случае, если ваш connection
проект не имеет close()
, вызываемого должным образом (из-за, возможно, некоторого исключения, возникающего между ними), объект connection
собирается GC, но само соединение незакрыто.Мы называем эту ситуацию утечкой соединения.
Один из лучших методов решения этой проблемы - обеспечить закрытие каждого соединения, на try...finally
, что в Java8 имеет метод try-with-resource для быстрого вызова.Для Scala можно создать эквивалентную структуру, см. этот пост для получения более подробной информации / извлеченного урока.
Для вашего последнего вопроса,
Что если искраспекуляция убивает эту задачу, пока соединение активно?Будет ли соединение по-прежнему удерживаться JVM?
JVM должным образом не будет больше удерживать соединение.И когда одноранговое соединение явно не закрывается одноранговым узлом, другой одноранговый узел (сторона сервера) не знает, следует ли ему закрывать его соответствующим образом до некоторого времени простоя.В любом случае, try finally
может охватывать все случаи, чтобы обеспечить правильную очистку всех соединений.