HashMap의 서브 클래스 인 내부 클래스를 사용하고 있습니다. 나는 String
을 키로, double[]
을 값으로 사용한다. 나는 double[]
당 약 200 배의 복식을 저장합니다. 키, 포인터 및 복식을 저장하려면 약 700 MB를 사용해야합니다. 그러나 메모리 분석 결과 두 개 이상 필요하다는 것을 알 수 있습니다 (2보다 약간 작음 GB).Java에서 직렬화 가능, 복제 가능 및 메모리 사용
TIJmp (프로파일 링 도구)을 사용하여 전체 메모리의 거의 절반을 사용하는 char[]
이 있음을 확인했습니다. TIJmp는 char[]
이 Serializable
과 Cloneable
에서 온다고 말했습니다. 그 값은 글꼴 목록과 메시지 및 단일 문자에 대한 기본 경로에서 다양합니다.
JVM에서 Serializable
의 정확한 동작은 무엇입니까? 항상 "영구"복사본을 유지하므로 내 메모리 사용 공간이 두 배가됩니까? JVM을 메모리 돼지로 바꾸지 않고 런타임에 객체의 바이너리 복사본을 작성하려면 어떻게해야합니까?
추 신 : 메모리 사용량이 가장 많이 증가하는 방식은 다음과 같습니다. 이 파일은 라인 당 약 229,000 개의 라인과 202 개의 필드를 가지고 있습니다.
public void readThetas(String filename) throws Exception
{
long t1 = System.currentTimeMillis();
documents = new HashMapX<String,double[]>(); //Document names to indices.
Scanner s = new Scanner(new File(filename));
int docIndex = 0;
if (s.hasNextLine())
System.out.println(s.nextLine()); // Consume useless first line :)
while(s.hasNextLine())
{
String[] fields = s.nextLine().split("\\s+");
String docName = fields[1];
numTopics = fields.length/2-1;
double[] thetas = new double[numTopics];
for (int i=2;i<numTopics;i=i+2)
thetas[Integer.valueOf(fields[i].trim())] = Double.valueOf(fields[i+1].trim());
documents.put(docName,thetas);
docIndex++;
if (docIndex%10000==0)
System.out.print("*"); //progress bar ;)
}
s.close();
long t2 = System.currentTimeMillis();
System.out.println("\nRead file in "+ (t2-t1) +" ms");
}
아!와 HashMapX는 다음과 같이 선언 된 내부 클래스입니다 :
public static class HashMapX< K, V> extends HashMap<K,V> {
public V get(Object key, V altVal) {
if (this.containsKey(key))
return this.get(key);
else
return altVal;
}
}
일부 코드 샘플을 표시 할 수 있습니까? – axtavt
Serializable이 메모리 풋 프린트를 증가시키는 것을 보여주는 테스트를 게시하십시오. 많은 RAM을 보여주는 코드를 게시 할 수 있다면 Map이 도움이 될 것입니다. –
당신의 진술을 이해할 수 있는지 보도록하겠습니다. Serializable 클래스를 선언하면 인스턴스가 차지하는 크기가 일시적 일 때보 다 더 커집니다. –