Java 优化大型集合的垃圾收集

Java 优化大型集合的垃圾收集,java,list,collections,garbage-collection,Java,List,Collections,Garbage Collection,我正在从数据库中读取大量此类List 然后,我从这些行列表中逐个读取数据,并将其中的数据放入容器对象中当我继续读取列表中的每一行时,是否应将其取消引用为空或是否应最终取消引用它们,以便对其进行垃圾收集 由于每一行都相当大,由大字符串/blob/文本内容等组成,因此我正在尝试优化垃圾收集。我希望这不是所谓的过早优化 如果您没有测量程序的性能,那么这是一个过早的优化 (并非在测量之前执行的所有优化都是不成熟的,但这种微观优化是不成熟的。)如果您没有测量程序的性能,那么这就是不成熟的优化 (并非所有在

我正在从数据库中读取大量此类
List

然后,我从这些行列表中逐个读取数据,并将其中的数据放入容器对象中当我继续读取列表中的每一行时,是否应将其取消引用为空是否应最终取消引用它们,以便对其进行垃圾收集


由于每一行都相当大,由大字符串/blob/文本内容等组成,因此我正在尝试优化垃圾收集。我希望这不是所谓的过早优化

如果您没有测量程序的性能,那么这是一个过早的优化


(并非在测量之前执行的所有优化都是不成熟的,但这种微观优化是不成熟的。)

如果您没有测量程序的性能,那么这就是不成熟的优化


(并非所有在测量前进行的优化都是不成熟的,但这种微观优化是不成熟的。)

正如拉斯曼所说,这正是不成熟优化的定义。然而,像这样的问题经常会弹出,我不想忘记它们,而是想立即添加分析点(由Logger.isEnabled()之类的开/关开关包装),然后继续。查看一个简单的分析工具/设置,正如larsmans所说,这正是过早优化的定义。然而,像这样的问题经常会弹出,我不想忘记它们,而是想立即添加分析点(由Logger.isEnabled()之类的开/关开关包装),然后继续。查看一个简单的分析工具/设置

我建议取消对它们的引用。这不是过早的优化,因为与时间不同,用于完成其任务的程序可用内存量不是由您控制的。

我建议取消对它们的引用。这不是过早的优化,因为与时间不同,可用于程序完成其任务的内存量不是由您控制的。

正如larsmans所提到的,存在复杂性的缺点

但也可能存在性能上的缺点—清空引用涉及写入内存,在现代垃圾收集环境中,写入内存不一定只是存储。也可能会有一些对收集器有利的簿记——在垃圾收集的上下文中查找“写屏障”和“卡片标记”。写入也会影响处理器缓存;在多处理器系统上,它会导致处理器之间的缓存一致性通信,从而消耗带宽


现在,我不认为这些影响有多大。但您应该意识到,写入内存并不总是像您想象的那样便宜。这就是为什么你必须在优化之前进行配置,然后再进行配置

正如拉斯曼所提到的,复杂性有一个缺点

但也可能存在性能上的缺点—清空引用涉及写入内存,在现代垃圾收集环境中,写入内存不一定只是存储。也可能会有一些对收集器有利的簿记——在垃圾收集的上下文中查找“写屏障”和“卡片标记”。写入也会影响处理器缓存;在多处理器系统上,它会导致处理器之间的缓存一致性通信,从而消耗带宽


现在,我不认为这些影响有多大。但您应该意识到,写入内存并不总是像您想象的那样便宜。这就是为什么你必须在优化之前进行配置,然后再进行配置

我恐怕要说它被称为
过早优化
。您是否检查了JVM使用情况统计数据,了解gc平均花费的时间?没有,我没有使用JDBC。我没有检查任何统计数据,但是指向JVM关于不再需要的变量有什么缺点吗?这里的惩罚是什么?我恐怕要说它被称为
过早优化
。您是否检查了JVM使用情况统计数据,了解gc平均花费的时间?没有,我没有使用JDBC。我没有检查任何统计数据,但是指向JVM关于不再需要的变量有什么缺点吗?这里的惩罚是什么?指向JVM中不再需要的变量有什么缺点吗?这里可能会有什么损失?@Marcos:损失是你的程序变得更加复杂,因此你在编写、维护和编译程序上花费的时间比运行程序时节省的时间还要多。(由于引用的局部性差和其他因素,它在运行时实际上可能会变慢,但这很难预测。)指向JVM关于不再需要的变量有什么缺点吗?这里可能会有什么损失?@Marcos:损失是你的程序变得更加复杂,因此你在编写、维护和编译程序上花费的时间比运行程序时节省的时间还要多。(由于引用的位置不好和其他因素,它在运行时也可能变慢,但这很难预测。)显然,其他一些回答者不理解优化或过早优化。从时间/CPU到内存的类比很难完美地进行下去。即使是这样,询问者也清楚地声明行是大的blob,并且您在内存中保留了其中的N个。其次,风险是不对称的,垃圾收集的成本与活动对象成正比(与N个blob的大小成正比),因此如果您的平台受到虚拟内存约束,您的gc可能会非常频繁地拷贝收集N个大blob,从而导致您的程序基本上冻结。与cputh不同,字符串使用的内存主要是字符数组;密苏里州,一个叫拜特伯弗的人