【问题标题】:How to avoid Out of memory exception without increasing Heap size on eclipse如何在不增加 Eclipse 堆大小的情况下避免内存不足异常
【发布时间】:2012-05-13 17:17:51
【问题描述】:

我有一个从文件中读取大量数据并将其写入 excel 文件的代码。我面临的问题是,当数据超出堆大小的限制时,它会抛出内存不足异常。我尝试增加堆大小,程序运行正常。但问题是,我的机器上的 RAM 有限,如果我将巨大的空间用于堆,机器就会变得非常慢。那么,有没有办法在处理一些数据限制后释放内存,这样我就不需要增加堆大小来运行我的代码?我对这种东西比较陌生,所以请提出一些想法

【问题讨论】:

  • 向我们展示(一个小型​​的、自包含的等)代码版本,您可以在其中读取和写入数据(仅此,不是您可能需要的所有其他内容,使其尽可能小,但是足够完整以显示行为),我们可能会对此发表评论。
  • 我必须从多个文件中读取数据,然后一次将其写入 excel 文件。

标签: java memory out-of-memory heap-memory


【解决方案1】:

在这种情况下,您需要重新构建代码,以便它可以处理小块数据。创建一个小缓冲区,将数据读入其中,对其进行处理并将其写入 Excel 文件。然后继续下一次迭代,读入同一个缓冲区。

当然,您使用的 Excel 库需要能够像这样工作,并且不需要一次性编写整个文件。

【讨论】:

    【解决方案2】:

    我认为,JXL API 提供了这种有限的缓冲区功能。它是一个开源 API。 http://jexcelapi.sourceforge.net/

    【讨论】:

      【解决方案3】:

      您可以将 DirectByteBuffer 与 Buffer.allocateDirect(byteSize); 一起使用或 MemoryMappedFile,它们使用堆内存之外的内存空间。

      【讨论】:

      • 但是,如果您达到操作系统/体系结构/硬件施加的内存限制,分配直接缓冲区也可能导致 OutOfMemoryError。在这种情况下很可能会发生这种情况,因为 OP 说他的机器内存不足。
      • 因此,您可以将数据持久化或保存到持久存储 (HDD),也许使用 Gson 将数据保存到磁盘
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-04
      • 1970-01-01
      • 2011-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多