您好我正在使用带有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元素或处理但我怀疑如果可能的话。 请帮助。任何帮助将不胜感激
答案 0 :(得分:2)
堆大小不是您的问题。如果您有其中一个,则会看到OutOfMemoryError
。
通常,当您遇到类似这样的性能问题时,您可以使用VisualVM
或手工使用System.nanoTime()
来跟踪代码的哪个部分是瓶颈。从那里,您确保使用适当的数据结构,算法等,然后查看可以在哪里并行化代码。
答案 1 :(得分:2)
12 x 8 x 6000双打不会占用大量内存
如果你的程序速度每次都变慢,直到它最终因OutOfMemoryError而崩溃,那么你可能会遇到导致内存泄漏的编码错误。
This question在Java中有一些内存泄漏原因的例子。
答案 2 :(得分:0)
我猜你以某种方式泄漏了JTable
。这可以通过Listeners,TableSorters等轻松实现。一个合适的工具会告诉你,但更好的方法是恕我直言解决问题。
它是GUI部分是什么造成了麻烦。理想情况下,剩下的程序应完全独立于GUI,因此您可以单独运行它,并且您将看到会发生什么。
我的大四学生建议使用硬盘存储器存储arraylist元素或处理,但我怀疑是否可能。
许多事情是可能的,但很少有意义。如果你真的只存储12 x 8 x 6000双打,那么这绝对没有意义。即使Double
的开销很高,也只有几兆字节。
另一个想法:如果您需要的所有数据都适合内存,那么您可以尝试预先读取所有数据。这可确保您不会存储多个副本。