我在 codereview 上给出的答案与您应该在这里使用的答案相同.....
但是,因为重复似乎没问题,所以我将在这里复制答案。
几乎可以肯定,问题在于您的Trace
班级结构,以及内存效率。您应该确保instrType
和hexAddress
存储为内存高效结构。instrType 似乎是 an int
,这很好,但只需确保它int
在 Trace 类中声明为 an 。
更可能的问题是 hexAddress 字符串的大小。您可能没有意识到,但字符串因“泄漏”内存而臭名昭著。在这种情况下,您有 aline
并且您认为您只是从中获取 hexString ......但实际上, hexString 包含整行......是的,真的。例如,看下面的代码:
public class SToken {
public static void main(String[] args) {
StringTokenizer tokenizer = new StringTokenizer("99 bottles of beer");
int instrType = Integer.parseInt(tokenizer.nextToken());
String hexAddr = tokenizer.nextToken();
System.out.println(instrType + hexAddr);
}
}
现在,在(我使用 eclipse)你的 IDE 中设置一个断点,然后运行它,你会看到 hexAddr 包含整行的 char[] 数组,它的偏移量为 3,计数为 7 .
由于字符串子字符串和其他构造的工作方式,它们可以为短字符串消耗大量内存......(理论上内存与其他字符串共享)。结果,您实际上是将整个文件存储在内存中!!!!
至少,您应该将代码更改为:
hexAddr = new String(tokenizer.nextToken().toCharArray());
但更好的是:
long hexAddr = parseHexAddress(tokenizer.nextToken());