【问题标题】:java performance degrading due to arraylist of size more than 6000由于数组列表大小超过 6000,java 性能下降
【发布时间】:2014-05-30 05:11:39
【问题描述】:

您好,我正在使用 jdk7 和 6GB 内存和英特尔 corei5 处理器。我有一个 java 代码,它的数组列表大小超过 6000,并且该数组列表中的每个元素都包含 12 个双精度值。处理速度下降了很多,并且现在运行整个代码大约需要 20 分钟。

代码的作用如下:

由于嵌套的 for 循环,发生了大约 4500 次迭代。在每次迭代中,都会读取一个 400 kb 的文件,并进行一些处理,并将一些值存储在 arraylist 中。

一旦 arraylist 准备好,arraylist 的值将通过 csvwriter 写入另一个文件。然后我使用了 jtable,jtable 还需要 arraylist 来引用该 arraylist 中的某些值。所以基本上我无法清除这个 arraylist。

我给堆内存的值如下

-Xms1024M -Xmx4096M

我是编程新手,我很困惑我应该怎么做?我可以增加堆大小吗?这有帮助吗?我的学长建议使用硬盘内存来存储数组列表元素或处理,但我怀疑如果可能的话。 请帮助。任何帮助将不胜感激

【问题讨论】:

  • 这听起来不像是内存问题,因为8*12*6000 = 576000 小于 1 MB。听起来更像你有一个算法问题。如果您更新您的问题,并提供有关您正在执行的处理的更多详细信息,我们可能会提供更好的帮助。
  • 我怀疑这是内存问题。尝试添加一些分析信息(甚至使用分析器)。
  • 4500 次迭代...嵌套 for 循环...让我向您保证,与调整堆的最大大小相比,这两个危险信号 更有利可图的优化点.
  • 我说堆大小是个问题,因为我有两次 OutOfMemoryError 之后我将内存增加到 4096M
  • 那么你在其他地方分配内存而不告诉我们。 :)

标签: java performance


【解决方案1】:

12 x 8 x 6000 双打不会占用大量内存

如果您的程序的速度每次都变慢,直到它最终因 OutOfMemoryError 而崩溃,那么您可能遇到了导致内存泄漏的编码错误。

This question 有一些 Java 中导致内存泄漏的示例。

使用VisualVM 或一些手动记录将有助于识别问题。像 FindBugsPMD 这样的静态代码分析器也可能会有所帮助。

【讨论】:

    【解决方案2】:

    堆大小不是您的问题。当您拥有其中一个时,您会看到OutOfMemoryError

    通常,当您遇到此类性能问题时,您会做一些分析,或者使用 VisualVM 之类的东西,或者手动使用 System.nanoTime() 来跟踪代码的哪一部分是瓶颈。从那里,您确保您使用了适当的数据结构、算法等,然后查看您可以在哪里并行化您的代码。

    【讨论】:

    • 我说堆大小是个问题,因为我有两次 OutOfMemoryError 之后我将内存增加到 4096M
    【解决方案3】:

    我猜你以某种方式泄露了JTables。 Listeners、TableSorters 等很容易发生这种情况。一个合适的工具会告诉你,但更好的方法是恕我直言,分解问题。

    GUI 部分是否会造成麻烦。理想情况下,剩下的程序应该完全独立于 GUI,因此您可以单独运行它,然后您会看到会发生什么。

    我的学长建议使用硬盘内存来存储数组列表元素或处理,但我怀疑这是否可能。

    许多事情都是可能的,但很少有事情是有意义的。如果你真的只存储 12 x 8 x 6000 双打,那绝对没有意义。即使Double 的开销很大,也只有几兆字节。

    另一个想法:如果您需要的所有数据都适合内存,那么您可以尝试预先读取所有数据。这样可以确保您不会存储多个副本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-05
      • 2014-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多