【问题标题】:Java Memory Leak using Config使用 Config 的 Java 内存泄漏
【发布时间】:2011-10-20 07:46:59
【问题描述】:

我们使用下面的代码从 XML 中读取配置值。我认为这可能会导致内存泄漏。

   // simulated code
   class ConfigReader {

      void matchPlanIDs() {
           ConfigurationItem[] items = ConfigurationHelper.getConfiguration("PLAN_IDS");
           // do something with here in for loop by reading from 
           // items[i].getTagVlue()...;  

           return;
      }
   }

items[] 是否在方法执行结束时引用了 ConfigurationHelper.getConfiguration("PLAN_IDS") 并且不能在一个周期内进行垃圾收集?这是一个强有力的参考吗?

感谢您的任何指点。

【问题讨论】:

  • 您确定这是内存泄漏吗?还是您只是消耗了太多内存?
  • 你在这里做什么 // 在 for 循环中通过读取检查您的班级是否以任何方式持有对项目的引用?
  • @HefferWolf:我有一个疑问。感谢您的澄清。如果 items[] 被声明为类级(静态)变量并初始化以保存配置中的元素,这将优化代码,因为不会为每个线程执行读取值,而只是第一次读取。对吗?
  • 如果将整行设置为静态类属性,则配置只会在类加载时运行(通常只有一次,但不要指望它)。

标签: java memory-leaks


【解决方案1】:

单独,

void matchPlanIDs() {
     ConfigurationItem[] items = ...
   return;
  }

不会导致内存泄漏。当然items 会被垃圾回收。

顺便说一句,最后的return也是没有意义的。

如果您认为ConfigurationHelper.getConfiguration(...) 导致了内存泄漏,请尝试通过一个简单的示例来验证这一点。如果您确实注意到异常行为,最好向ConfigurationHelper 的作者提交错误报告。但是,我怀疑这种情况不太可能,并且我怀疑您的内存消耗问题出在其他地方。

【讨论】:

    【解决方案2】:

    items 实例可以在方法执行结束后立即进行垃圾回收,因为没有任何东西持有对它的引用。这没有任何内存泄漏的可能性。在执行该方法期间,数组可能会消耗大量内存,如果您的 GC 配置不正确,可能会导致 Full GC。

    【讨论】:

      【解决方案3】:
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-20
      • 2016-09-29
      • 2015-08-14
      • 2012-08-11
      • 2015-12-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多