RAM的消耗将会因为巨大的数据库大小和结果集的大小而产生。
尝试以下优化垃圾回收:
注意字符串拼接操作符(+)的使用,改用concat()方法
如果使用Spring,请尝试setFetchSize(每次获取的行数),使用setFetchSize会增加执行时间,但它是内存高效的
删除所有不必要的语句
使用异步执行
String
实例时。在这种情况下,String.concat
可能比使用 StringBuilder
更快,因为它的实现会预先创建一个正确大小的数组,并将两个输入字符串直接复制到该数组中,并使用该数组创建一个新的 String
实例(不需要防御性复制)。但是,JVM 专门针对典型的 StringBuilder
使用进行了优化并消除了开销。而 Java 9+ 将完全不同地编译 +
运算符... - HolgerString.concat
与toString()
组合在参数中,它比+
运算符更昂贵,因为这些中间的String
实例需要内存,并暗示字符内容的附加复制操作。我不知道为什么你认为它们在使用concat
时是免费的,或许是魔术? - Holgerinvokedynamic
指令,在运行时进行链接,因此,是JRE决定如何实现特定的场景。因此,如果您使用+
与正好两个字符串参数,则可能会链接到执行完全相同操作的某些代码,例如String.concat
。但更好的是,每个特定的组合都可以链接到在运行时动态生成的专门代码。此外,如果认为有用,它还可以在幕后实现缓存等等... - Holger