아래의 설명에서 데이터에 대한 일반 메모리 만 범위에 있습니다. 구조체에 대한 모든 추가 메모리 필요가 없어집니다. 세부적인면에서 볼 때 개요입니다.
메모리가 그 라인을
String parcour = "";
...
String line = bReader.readLine();
...
parcour += line;
라인 parcour += line
에 먹는 parcour
가정
new StringBuilder().append(parcour).append(line).toString()
으로 클래스 파일로 컴파일 크기가 10MB로 문자열을 포함하고 line
크기의 것입니다 2 MB. 새로 만들어진 문자열이 parcour
(34) 주위 MB에 할당하기 전에 다음 parcour += line;
동안 할당 된 메모리가 될 것이다 (대략)
// creates a StringBuilder object of size 12 MB
new StringBuilder().append(parcour).append(line)
// the `.toString()` would generate a String object of size 12 MB
new StringBuilder().append(parcour).append(line).toString()
코드는 필요합니다.
parcour = 10 MB
the temporary StringBuilder object = 12 MB
the String fromStringBuilder = 12 MB
------------------------------------------
total 34 MB
작은 데모 조각
는
OutOfMemoryException
이 훨씬 이전에 현재 기대 후 발생 된 것입니다.
OOMString.java
class OOMString {
public static void main(String[] args) throws Exception {
String parcour = "";
char[] chars = new char[1_000];
String line = new String(chars);
while(line != null)
{
System.out.println("length = " + parcour.length());
parcour += line;
}
}
}
OOMStringBuilder.java
class OOMStringBuilder {
public static void main(String[] args) throws Exception {
StringBuilder parcour = new StringBuilder();
char[] chars = new char[1_000];
String line = new String(chars);
while(line != null)
{
System.out.println("length = " + parcour.length());
parcour.append(line);
}
}
}
두 조각이 동일한 않습니다. 그들은 OutOfMemoryException
이 던져 질 때까지 parcour
에 1,000 자 문자열을 추가합니다. 속도를 높이기 위해 힙 크기를 10MB로 제한합니다. 코드를 실행하면 java -Xmx10m OOMString
length = 1048000
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
출력
length = 2052000
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
java -Xmx10m OOMStringBuilder
의의
출력 당신은 OOMString
요구에 훨씬 더 많은 시간이 OOMStringBuilder
보다 (심지어 짧은 길이에) 실패하는 것을 알 수 있습니다.
단일 문자는 2 바이트 길이라는 점을 명심해야합니다.파일에 ASCII 문자 100 개가 포함되어 있으면 메모리에서 200 바이트를 소비합니다.
아마도이 작은 데모가 당신에게 조금 설명 할 수 있습니다.
전체 파일을'parcour' 변수에 저장합니다. 이것은 많은 기억을 먹을 것입니다. 또한, 문자열에 데이터를 추가 할 때'StringBuilder'를 사용하는 것을 고려하십시오. – ar34z
하지만 실제로 문자열은 많은 메모리를 먹어서는 안됩니다. 그렇습니까? StringBuilder를 사용하면 어떤 이점이 있습니까? 그리고 대략 어떻게 설정합니까? – Cyaena
저는 메모리 사용법을 설명하는 사람이 아니지만 200mil을 저장하고 있습니다. 기억 속의 인물들은별로 유망하지 않다. 루프에서 문자열을 연결하면 'StringBuilder'가 더 빠릅니다. 2 억 라인으로 무엇을하려하고 있습니까? 아마도 이것은 당신을 도울 수 있습니다 : http://stackoverflow.com/questions/10202905/is-it-advisable-to-store-large-strings-in-memory-or-repeatedly-read-a-file 메모리 사용에 대한 더 많은 정보 : http://www.javamex.com/tutorials/memory/string_memory_usage.shtml – ar34z