垃圾收集行为

时间:2014-07-11 17:54:31

标签: java arraylist garbage-collection queue

在启动我的应用程序期间,查询数据库,创建对象(从查询结果中)并插入到Arraylist中。 arraylist后来循环,并从中创建另一个数据结构。 arraylist(大小很大)后来被垃圾收集。我的问题是,这是一个垃圾收集器的压力,立即收集这样一个大的对象。如果我创建一个QUEUE数据结构而不是arraylist,该怎么办?从队列中读取对象将使它们符合GC的条件。 GC的压力是否较小?我知道GC可以随时运行,并且不保证它的执行。更多的是执行的时间,我想要理解的是,从内存(arraylist)的连续位置收集GC的更多工作与队列中的内存分配不连续的队列有关吗?

2 个答案:

答案 0 :(得分:3)

  

对于从内存(arraylist)的连续位置收集GC而不是内存分配不连续的队列,更多的工作是什么?

清理基于链表的队列比使用ArrayList更有效。这是因为ArrayList有两个对象,Queue每个元素有一个对象。

如果要减少GC负载,请在阅读时处理数据。这样您就不会需要队列或列表,并且您可能会发现在下载之前已经处理了所有数据。也就是说它可能会快得多。

答案 1 :(得分:1)

这里最大的压力来自于保持物体的尺寸和尺寸大的物体。在记忆中。如果需要在堆上创建其他对象,甚至导致“内存不足”,它可能会导致GC更频繁地工作。当DB和ArrayList的大小增加时出现异常。

任何可以减少分配给"巨大"的内存大小的解决方案。对象会有所帮助。如果您可以以快速释放队列元素的方式构建队列,而无需等待从DB读取所有其他对象,那就去吧。

正如彼得在他的回答中提到的那样,一旦从数据库中读取一个对象而不排队或添加到列表中,它会更好。

可能的解决方案之一是重新设计数据访问层并使用ResultSet(http://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html),这可以在我能想到的任何Java平台中使用。由于ResultSet保留在数据库端,因此您可以一次读取一个记录并显着减少内存的压力。

另一种方法是实现分页,例如通过更改原始查询,使得一次只从DB读取一部分ListArray。

相关问题