【发布时间】:2011-05-24 18:22:24
【问题描述】:
我有一个程序,其中有问题的循环看起来像这样
int numOfWords = 1000;
int avgSizeOfWord = 20;
while(all documents are not read) {
char[][] wordsInDoc = new char[numOfWords][avgSizeOfWord];
for(int i=0; i<numWordsInDoc; i++) {
wordsInDoc[i] = getNextWord();
}
processWords(wordsInDoc);
}
我想知道当这个循环执行时幕后会发生什么。垃圾收集器何时收集已分配给每个文档的内存?他们是做同样事情的更好方法(wrt 内存使用)吗?
感谢任何见解。
【问题讨论】:
-
Java 有一个不确定的垃圾收集器,这意味着无法仅通过查看一段代码来预测其行为。
-
您的问题可能更多是关于 JIT 而不是 GC 算法,即如果此代码由 JIT 编译,那么您的代码版本是什么样的?例如 processWords 是做什么的?它会内联吗?如果是这样,wordInDoc 会被提升到循环之外吗?有没有可能被吊起来?可能还有其他一些可能的编译途径......
-
@Matt 我需要研究 JIT 的工作原理,因为我完全不知道这一点。但是我没有理解这个特定句子的含义如果有,wordsInDoc 会被提升到循环之外吗? 比如说,
processWords将单词写入文件,那么场景是什么?跨度> -
我建议从这个包中阅读 TS-5427 -- download.oracle.com/javaone/javaone2009-core-se.zip -- 这是 JavaOne 关于“Inside Out - A Modern Virtual Machine Revealed”的演讲
标签: java memory-management garbage-collection