由于大小超过6000的arraylist导致java性能下降

时间:2014-05-30 05:11:39

标签: java performance

您好我正在使用带有intel corei5处理器的6GB的jdk7和ram。我有一个java代码,它有一个大小超过6000的arraylist,并且该arraylist中的每个元素包含12个double值。处理速度已经大大降低了现在运行整个代码需要大约20分钟。

代码的作用如下:

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

一旦arraylist准备就绪,arraylist的值通过csvwriter写在另一个文件中,然后我使用了jtable,jtable也需要arraylist来引用该arraylist中的一些值。所以基本上我不能清除这个arraylist。

我已经给出了堆内存的值,如下所示

-Xms1024M -Xmx4096M

我是编程的新手,我对我应该做什么感到困惑?我可以增加堆大小吗?这会有帮助吗?我的大四学生建议使用硬盘存储来存储arraylist元素或处理但我怀疑如果可能的话。 请帮助。任何帮助将不胜感激

3 个答案:

答案 0 :(得分:2)

堆大小不是您的问题。如果您有其中一个,则会看到OutOfMemoryError

通常,当您遇到类似这样的性能问题时,您可以使用VisualVM或手工使用System.nanoTime()来跟踪代码的哪个部分是瓶颈。从那里,您确保使用适当的数据结构,算法等,然后查看可以在哪里并行化代码。

答案 1 :(得分:2)

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

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

This question在Java中有一些内存泄漏原因的例子。

使用VisualVM或某些手动记录将有助于确定问题。像FindBugsPMD这样的静态代码分析器也可以提供帮助。

答案 2 :(得分:0)

我猜你以某种方式泄漏了JTable。这可以通过Listeners,TableSorters等轻松实现。一个合适的工具会告诉你,但更好的方法是恕我直言解决问题。

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

  

我的大四学生建议使用硬盘存储器存储arraylist元素或处理,但我怀疑是否可能。

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

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