为什么要关闭 resourceResolver 对象
Why resourceResolver object should be closed
如here所述,我应该关闭从工厂获得的资源解析器。
It is very important to call the close() method once the resource resolver is not used any more to ensure any system resources are properly clean up.
但是我不明白为什么我要这样做,因为为什么java垃圾收集框架不自动释放内存?
我知道一个对象如果有引用就不会被垃圾回收。
让我们举个例子:
public class MyServiceImpl{
@Reference
ResourceResolverFactory rrf;
public void someFunction(){
ResourceResolver resourceResolver = rrf.getServiceResourceResolver(Map object);
resourceResolver.getResource(path);
}
}
在上面这段代码中,resourceResolver对象只是用来获取资源的。在函数执行结束后,不再有 resourceResolver 对象的引用。所以我不明白为什么 java 垃圾收集器不能释放内存?它还有什么参考价值?
我能想到的一个原因,据我所知,ResourceResolverFactory class 给出了 Singleton 对象,在 Singleton 的情况下 class 该对象在程序结束之前和在此期间没有资格进行垃圾收集如果我们创建数千个 ResourceResolver 对象,那么在程序结束之前内存不会释放。这是正当理由吗?
Singleton ResourceResolverFactory和ResourceResolver对象之间是否存在内存映射?
ResourceResolver
接口抽象了跨多个源访问资源的细节。根据底层实现,这可能是 JCR、捆绑资源或某种其他形式的存储。访问底层“数据库”可能需要某种形式的身份验证。例如,通常,当从 AEM 中的存储库读取资源时,每个资源解析器都会打开一个基础 JCR 会话。当不再需要时,需要终止此会话。从广义上讲,它不仅仅是纯粹的垃圾 collection/memory 管理约束,而且根据底层实现,可能还涉及一些其他资源清理。 ResourceProvider
上的 Javadoc 对此进行了更详细的解释。
也就是说,此行为是通过许多接口及其相应的实现实现的 classes,它们引入了一些与垃圾收集过程有关的有趣的事情。
CommonResourceResolverFactoryImpl
class实现了所有资源解析器工厂的共享功能(参见ResourceResolverFactory
)是一个holds a map of weak references开启[=10=的Singleton ] 实例。
这需要 cleaned up,因为特定的 ResourceResolver
实例已关闭。
您可能会注意到有一个 ResourceResolverControl
associated with each of those ResourceResolver
instances. It is the ResourceResolverControl
class that ensures all ResourceProvider
instances are properly closed together with the encompassing ResourceResolver
. As you close a particular ResourceResolver
, this is orchestrated by the relevant ResourceResolverFactory
按照我的理解,那些 classes 之间的关系和它们的垃圾收集影响 并不是我们必须调用 ResourceResolver#close
的原因 .该设计反映了对不同提供者进行抽象化的需要,其中一些提供者使用需要清理的资源。
如here所述,我应该关闭从工厂获得的资源解析器。
It is very important to call the close() method once the resource resolver is not used any more to ensure any system resources are properly clean up.
但是我不明白为什么我要这样做,因为为什么java垃圾收集框架不自动释放内存? 我知道一个对象如果有引用就不会被垃圾回收。 让我们举个例子:
public class MyServiceImpl{
@Reference
ResourceResolverFactory rrf;
public void someFunction(){
ResourceResolver resourceResolver = rrf.getServiceResourceResolver(Map object);
resourceResolver.getResource(path);
}
}
在上面这段代码中,resourceResolver对象只是用来获取资源的。在函数执行结束后,不再有 resourceResolver 对象的引用。所以我不明白为什么 java 垃圾收集器不能释放内存?它还有什么参考价值?
我能想到的一个原因,据我所知,ResourceResolverFactory class 给出了 Singleton 对象,在 Singleton 的情况下 class 该对象在程序结束之前和在此期间没有资格进行垃圾收集如果我们创建数千个 ResourceResolver 对象,那么在程序结束之前内存不会释放。这是正当理由吗? Singleton ResourceResolverFactory和ResourceResolver对象之间是否存在内存映射?
ResourceResolver
接口抽象了跨多个源访问资源的细节。根据底层实现,这可能是 JCR、捆绑资源或某种其他形式的存储。访问底层“数据库”可能需要某种形式的身份验证。例如,通常,当从 AEM 中的存储库读取资源时,每个资源解析器都会打开一个基础 JCR 会话。当不再需要时,需要终止此会话。从广义上讲,它不仅仅是纯粹的垃圾 collection/memory 管理约束,而且根据底层实现,可能还涉及一些其他资源清理。 ResourceProvider
上的 Javadoc 对此进行了更详细的解释。
也就是说,此行为是通过许多接口及其相应的实现实现的 classes,它们引入了一些与垃圾收集过程有关的有趣的事情。
CommonResourceResolverFactoryImpl
class实现了所有资源解析器工厂的共享功能(参见ResourceResolverFactory
)是一个holds a map of weak references开启[=10=的Singleton ] 实例。
这需要 cleaned up,因为特定的 ResourceResolver
实例已关闭。
您可能会注意到有一个 ResourceResolverControl
associated with each of those ResourceResolver
instances. It is the ResourceResolverControl
class that ensures all ResourceProvider
instances are properly closed together with the encompassing ResourceResolver
. As you close a particular ResourceResolver
, this is orchestrated by the relevant ResourceResolverFactory
按照我的理解,那些 classes 之间的关系和它们的垃圾收集影响 并不是我们必须调用 ResourceResolver#close
的原因 .该设计反映了对不同提供者进行抽象化的需要,其中一些提供者使用需要清理的资源。