【问题标题】:Why resourceResolver object should be closed为什么要关闭 resourceResolver 对象
【发布时间】:2020-09-14 15:33:48
【问题描述】:

here所说,我应该关闭从工厂获得的资源解析器。

在资源解析器不再使用时调用 close() 方法非常重要,以确保正确清理任何系统资源。

但我不明白为什么要这样做,因为为什么 java 垃圾收集框架不会自动释放内存? 我知道一个对象如果有引用就不会被垃圾收集。 让我们举个例子:

 public class MyServiceImpl{

  @Reference
  ResourceResolverFactory rrf;

  public void someFunction(){
      ResourceResolver resourceResolver = rrf.getServiceResourceResolver(Map object);
      resourceResolver.getResource(path);
   }

 }

在上面这段代码中,resourceResolver 对象只是用来获取资源的。并且在函数执行结束后,resourceResolver 对象不再存在引用。所以我不明白为什么java垃圾收集器不能释放内存?它仍然具有什么参考价值?

我能想到的一个原因,因为我知道 ResourceResolverFactory 类提供了 Singleton 对象,并且在 Singleton 类的情况下,该对象在程序结束之前没有资格进行垃圾收集,在此期间如果我们创建数千个 ResourceResolver 对象然后内存在程序结束之前不会释放。这是一个正当的理由吗? Singleton ResourceResolverFactory 和 ResourceResolver 对象之间是否有内存映射?

【问题讨论】:

  • 垃圾收集器负责处理内存。而且只有记忆。不是资源。

标签: java garbage-collection aem sling


【解决方案1】:

ResourceResolver 接口抽象出跨多个来源访问资源的细节。根据底层实现,这可能是 JCR、捆绑资源或某种其他形式的存储。访问底层“数据库”可能需要某种形式的身份验证。例如,通常,当从 AEM 中的存储库读取资源时,每个资源解析器都会打开一个底层 JCR 会话。当不再需要此会话时,需要终止它。从广义上讲,它不仅仅是纯粹的垃圾收集/内存管理约束,而且根据底层实现,可能还涉及其他一些资源清理。 ResourceProvider 上的 Javadoc 更详细地解释了这一点。

也就是说,这种行为是通过许多接口及其相应的实现类来实现的,这些接口引入了一些与垃圾收集过程有关的有趣事物。

实现所有资源解析器工厂的共享功能的CommonResourceResolverFactoryImpl 类(参见ResourceResolverFactory)是一个单例,holds a map of weak references 打开ResourceResolver 实例。

这需要是cleaned up,因为特定的ResourceResolver 实例已关闭。

您可能会注意到有一个ResourceResolverControl associated with each of those ResourceResolver instances。正是ResourceResolverControl 类确保所有ResourceProvider 实例与包含ResourceResolver 一起正确关闭。当您关闭特定的ResourceResolver 时,这是orchestrated by the relevant ResourceResolverFactory

按照我的理解,这些类之间的关系及其垃圾收集影响不是我们必须调用ResourceResolver#close 的原因。该设计反映了抽象出不同提供者的需要,其中一些提供者使用需要清理的资源。

【讨论】:

  • 非常感谢您的详细解释,您能否澄清“不再需要时需要终止此会话”是什么意思。这是否意味着对并发 JCR 会话的数量有一些限制,如果我不关闭则不会创建新会话?
  • @Learner 我不知道打开 JCR 会话的数量有硬性限制。如果有的话,我从来没有看到它到达过。然而,我所看到的是,由于编码错误(通常是未关闭的ResourceResolver),越来越多的未关闭的 JCR 会话。这可能会导致内存消耗增加、总体速度变慢,并最终超过 JVM 进程可用的内存量。
猜你喜欢
  • 2021-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多