{
StringBuilder fileBuff = new StringBuilder();
long before = getUsedMem();
try {
//Open InputStreamReader here
while ((currLine = lnr.readLine()) != null) {
fileBuff.append("\r\n" + currLine);
}
//Close streams
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("usedTotal: " + (getUsedMem() - before));
}
private long getUsedMem() {
return Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
}
Trong khi chạy mã nhiều lần, tôi nhận được usedTotal ~ 14.279.888, nhưng nếu tôi thay thế với fileBuff.append("\r\n").append(currLine)
tôi nhận được gần gấp đôi bộ nhớ ~ 33.264.440.
Ai đó có thể giải thích lý do, như tôi biết String
nối cũng sử dụng StringBuilder
?StringBuilder sử dụng bộ nhớ hơn khi append được sử dụng
I: fileBuff.append ("\ r \ n" + currLine);
62: aload 6
64: invokevirtual #16 // Method java/io/LineNumberReader.readLine:()Ljava/lang/String;
67: dup
68: astore_2
69: ifnull 99
72: aload_1
73: new #2 // class java/lang/StringBuilder
76: dup
77: invokespecial #3 // Method java/lang/StringBuilder."<init>":()V
80: ldc #17 // String \r\n
82: invokevirtual #8 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
85: aload_2
86: invokevirtual #8 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
89: invokevirtual #10 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
92: invokevirtual #8 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
95: pop
96: goto 62
II fileBuff.append ("\ r \ n"). Append (currLine)
62: aload 6
64: invokevirtual #16 // Method java/io/LineNumberReader.readLine:()Ljava/lang/String;
67: dup
68: astore_2
69: ifnull 86
72: aload_1
73: ldc #17 // String \r\n
75: invokevirtual #8 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
78: aload_2
79: invokevirtual #8 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
82: pop
83: goto 62
Rõ ràng #II nên sử dụng ít bộ nhớ, nhưng nó không. Tập tin tôi đọc dài 50k.
"* StringBuilder sử dụng nhiều bộ nhớ hơn khi nối thêm được sử dụng *". Có nó, vì vậy mảng sẽ không được mở rộng mỗi khi một cái gì đó được nối thêm. – johnchen902
@ johnchen902 Tôi nghĩ rằng đây phải là câu trả lời, không phải là bình luận ... – Puce
@Puce Không phải là câu trả lời khi tôi không tìm thấy bằng chứng. – johnchen902