假设我在Java中有一个表达式,例如:
String s = "abc" + methodReturningAString() + "ghi" +
anotherMethodReturningAString() + "omn" + "blablabla";
Run Code Online (Sandbox Code Playgroud)
Java的默认JDK编译器的行为是什么?它只是制作五个连接还是有智能性能技巧?
我们有一些操作,我们正在进行大量的大型字符串连接,并且最近遇到了内存不足异常.不幸的是,调试代码不是一种选择,因为这是在客户站点发生的.
因此,在研究代码的大修之前,我想问一下:对于大型字符串,StringBuilder的RAM消耗特性是什么?
特别是它们与标准字符串类型相比.字符串的大小超过10 MB,我们似乎遇到了大约20 MB的问题.
注意:这不是速度而是RAM.
我需要从数据库中导出大量数据.这是代表我的数据的类:
public class Product{
...
@OneToMany
@JoinColumn(name = "product_id")
@Cascade({SAVE_UPDATE, DELETE_ORPHAN})
List<ProductHtmlSource> htmlSources = new ArrayList<ProductHtmlSource>();
Run Code Online (Sandbox Code Playgroud)
...}
ProductHtmlSource - 包含我实际需要导出的大字符串.
由于导出数据的大小比JVM内存大,我正在按块读取数据.像这样:
final int batchSize = 1000;
for (int i = 0; i < 50; i++) {
ScrollableResults iterator = getProductIterator(batchSize * i, batchSize * (i + 1));
while (iterator.getScrollableResults().next()) {
Product product = (Product) iterator.getScrollableResults().get(0);
List<String> htmls = product.getHtmlSources();
<some processing>
}
Run Code Online (Sandbox Code Playgroud)
}
代码getProductIterator:
public ScrollableResults getProductIterator(int offset, int limit) {
Session session = getSession(true);
session.setCacheMode(CacheMode.IGNORE);
ScrollableResults iterator …Run Code Online (Sandbox Code Playgroud)