【问题标题】:Out of memory while processing large number of objects in HashMap/Hashtable/ArrayList处理 HashMap/Hashtable/ArrayList 中的大量对象时内存不足
【发布时间】:2012-10-26 11:18:06
【问题描述】:

我正在做一个项目,其中需要在 HashMap/Hashtable/ArrayList 中加载数千个对象的数据。小型应用程序没有问题,但在大型应用程序中内存不足

请建议如何处理这种情况?

【问题讨论】:

  • 你需要增加java堆空间。计算所需空间并相应增加。我的This answer 解释了如何计算和增加它。
  • 我的应用程序不是 Eclipse 应用程序。它是一个桌面独立 Java 应用程序。那么如何从 Java 代码中增加内存呢?
  • 是的,正如@Thom 指出的那样,使用random access file 或@Randy 所说的数据库。我会说如果你足够灵活来支持它的数据库。去吧
  • 您无法在正在运行的 Java 程序中增加分配的堆空间量。如果您发现内存不足,请在启动应用之前增加堆大小。

标签: java memory


【解决方案1】:

为什么它需要在内存中?我会说使用随机访问文件。

【讨论】:

    【解决方案2】:

    我想知道您在这里的要求,为什么同时加载数千个对象很重要?你能提供更多关于它的细节吗?也许你的实现可以重新设计,这样你就不需要在内存中加载那么多对象了。

    【讨论】:

    • 看到您的回复后,我仍然认为您应该重新考虑是否需要同时加载内存中的所有对象。由于您不知道需要加载多少对象,因此即使您尝试增加堆大小,您也无法确定堆大小。我认为您应该考虑使用@Thom/Randy 建议的文件或数据库。
    【解决方案3】:

    不要一次将所有数据读入内存,或者在执行前扩展可用内存。

    您不能以编程方式增加堆大小。

    【讨论】:

    【解决方案4】:

    要么您必须增加内存,要么您必须检查代码是否存在应用程序创建许多对象的某个点(可能在循环中)。如果存在,则取消该对象(确保它不会影响您的应用程序流程)。另一种选择尝试使用更轻的对象(例如,如果您可以正确覆盖 toString() 方法,则可以使 bean 对字符串对象更轻。这也将提高应用程序的性能)

    【讨论】:

      【解决方案5】:

      您可以使用缓存系统,例如ehcache。这将使您对使用的“内存”有所控制。还有其他的缓存实现,ehcache 可能不适合你的需求。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-13
        • 2014-07-20
        • 2010-11-03
        • 2016-09-02
        • 1970-01-01
        • 2013-08-17
        相关资源
        最近更新 更多