Java 中的可序列化、可克隆和内存使用
我正在使用一个内部类,它是HashMap的子类。我有一个作为键和值。我存储大约200双打每个.我应该使用大约700 MB来存储密钥,指针和双精度。但是,内存分析显示,我需要的远不止于此(略高于2 GB)。String
double[]
double[]
使用TIJmp(分析工具),我看到有一个几乎使用了总内存的一半。TIJmp说来自和。其中的值范围从字体列表和默认路径到消息和单个字符。char[]
char[]
Serializable
Cloneable
在 JVM 中的确切行为是什么?它是否始终保持“持久”副本,从而使我的内存占用量增加一倍?如何在运行时编写对象的二进制副本,而不会将 JVM 变成内存占用?Serializable
PS:内存消耗增加最大的方法是下面的方法。该文件每行大约有 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;
}
}