Java中的可序列化,可克隆和内存使用
|
我正在使用一个内部类,它是HashMap的子类。我有一个键“ 0”和值“ 1”。我每ѭ1存入200倍。我应该使用700 MB左右的空间来存储键,指针和双打。但是,内存分析显示我需要的更多(超过2 GB)。
使用TIJmp(分析工具),我看到有一个
char[]
占用了几乎全部内存的一半。 TIJmp说char[]
来自Serializable
和Cloneable
。其中的值范围从字体列表和默认路径到消息和单个字符。
JVM中的“ 5”的确切行为是什么?是否一直保持“持久”副本,从而使内存占用空间增加一倍?如何在运行时编写对象的二进制副本,而又不将JVM变成内存猪?
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;
}
}
没有找到相关结果
已邀请:
2 个回复
琳娘
撕吠
我在这里传播:
发生的是docName是对数组(字段)中元素的引用,而我在程序的整个生命周期中都保留了该引用(通过将其存储在全局HashMap文档中)。只要我保持该引用有效,就不能对整个String []字段进行垃圾收集。解决方案:
因此,复制对象并释放对数组元素的引用。这样,一旦我处理了每个字段,垃圾收集器就可以释放数组使用的内存。 我希望这对使用split解析大型文本文件并将某些字段存储在全局变量中的所有人员有用。 感谢大家的评论。他们引导我朝着正确的方向前进。