Java 垃圾收集行为

Java 垃圾收集行为,java,arraylist,garbage-collection,queue,Java,Arraylist,Garbage Collection,Queue,在我的应用程序启动期间,将查询数据库,创建对象(根据查询结果)并将其插入Arraylist中。arraylist随后被循环,并从中创建另一个数据结构。arraylist(其大小巨大)稍后将被垃圾收集。我的问题是,一次收集这么大的对象对垃圾收集器来说是一种压力吗。如果我创建一个队列数据结构而不是arraylist呢。从队列中读取对象将使它们符合GC的条件。这是GC上的较小菌株吗?我知道GC可以随时运行,并且不能保证它的执行。除了执行时间之外,我想了解的是,GC从连续的内存位置(arraylist)

在我的应用程序启动期间,将查询数据库,创建对象(根据查询结果)并将其插入Arraylist中。arraylist随后被循环,并从中创建另一个数据结构。arraylist(其大小巨大)稍后将被垃圾收集。我的问题是,一次收集这么大的对象对垃圾收集器来说是一种压力吗。如果我创建一个队列数据结构而不是arraylist呢。从队列中读取对象将使它们符合GC的条件。这是GC上的较小菌株吗?我知道GC可以随时运行,并且不能保证它的执行。除了执行时间之外,我想了解的是,GC从连续的内存位置(arraylist)收集内存比从队列收集内存分配不连续的内存要多吗

对于GC来说,从连续的内存位置(arraylist)进行收集比从内存分配不连续的队列中进行收集要多吗

清理基于链表的队列比清理ArrayList需要更多的工作。这是因为ArrayList有两个对象,队列中每个元素有一个对象

如果要减少GC负载,请在读取数据时对其进行处理。这样,您就不需要队列或列表,您可能会发现在下载数据时已经处理了所有数据。i、 它也可以快一点

对于GC来说,从连续的内存位置(arraylist)进行收集比从内存分配不连续的队列中进行收集要多吗

清理基于链表的队列比清理ArrayList需要更多的工作。这是因为ArrayList有两个对象,队列中每个元素有一个对象


如果要减少GC负载,请在读取数据时对其进行处理。这样,您就不需要队列或列表,您可能会发现在下载数据时已经处理了所有数据。i、 它也可以快一点。

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

任何允许您减少分配给“巨大”对象的内存大小的解决方案都会有所帮助。如果您可以以这样一种方式构建队列,即队列元素可以快速释放,而无需等待所有其他对象从数据库中读取,那么就开始吧

正如Peter在他的回答中提到的,在从DB中读取对象后立即处理该对象,而不将其排队或添加到列表中,这将是更好的方法

其中一个可能的解决方案是重新设计数据访问层并使用ResultSet(),它可以在我能想到的任何Java平台上使用。由于ResultSet保存在DB端,因此您可以一次读取一条记录,并显著减少内存紧张


另一种方法是实现分页,例如,通过更改原始查询,一次只能从数据库中读取ListArray的一部分。

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

任何允许您减少分配给“巨大”对象的内存大小的解决方案都会有所帮助。如果您可以以这样一种方式构建队列,即队列元素可以快速释放,而无需等待所有其他对象从数据库中读取,那么就开始吧

正如Peter在他的回答中提到的,在从DB中读取对象后立即处理该对象,而不将其排队或添加到列表中,这将是更好的方法

其中一个可能的解决方案是重新设计数据访问层并使用ResultSet(),它可以在我能想到的任何Java平台上使用。由于ResultSet保存在DB端,因此您可以一次读取一条记录,并显著减少内存紧张


另一种方法是实现分页,例如通过更改原始查询,每次仅从数据库读取ListArray的一部分。

向数据库触发一个查询,返回数据列表。因此,在某种程度上,我必须处理大量的数据。我不知道如何访问数据库,但有一种东西叫做“结果集”(参见),JDBC支持它。结果集保存在数据库端,您可以逐个读取记录,而不会占用大量内存,因此您可能需要重新设计查询数据库的方式,以避免将来可能出现的中断。将向数据库触发一个查询,并返回数据列表。因此,在某种程度上,我必须处理大量的数据。我不知道如何访问数据库,但有一种东西叫做“结果集”(参见),JDBC支持它。结果集保存在数据库端,您可以逐个读取记录,而不会占用大量内存,因此您可能需要重新设计查询数据库的方式,以避免将来可能出现的中断。