我正在尝试分析在redhat机器上运行的java 7应用程序。当我按如下方式运行时:
java -agentlib:hprof=cpu=samples,depth=10,monitor=y,thread=y ...
通过逐行读取非常大的gzip压缩文本文件来创建表类型对象的特定代码块在大约6分钟内完成。当我像这样运行时:
java -agentlib:hprof=heap=sites,depth=10,monitor=y,thread=y ...
同一个区块需要花费几个数量级的时间来完成(我估计的时间是24小时)
这是读取文件的方法(类的一部分):
private static void ingestValues()
{
int mSize = 30000;
pairScoresTable = new float[mSize][];
for (int i = 0; i < pairScoresTable.length; i++) {
pairScoresTable[i] = new float[mSize];
Arrays.fill(pairScoresTable[i], fillVal);
}
try
{
BufferedReader bufferedReader =
new BufferedReader(
new InputStreamReader(
new GZIPInputStream(
new FileInputStream(rawPath)), "US-ASCII"));
String line = null;
while((line = bufferedReader.readLine()) != null) { // file has 388661141 lines
Float value = 0.0F;
Integer i = 0;
Integer j = 0;
// extract value, i and j by parsing line...
pairScoresTable[i][j] = value;
pairScoresTable[j][i] = value;
}
bufferedReader.close();
}
catch(Exception e)
{
return;
}
return;
}
所以它基本上读取一个文件,每一行都被格式化,以描述{2}矩阵value
中pairScoresTable
的位置。
为什么执行时间差异如此之大?有没有办法更快地对这段代码进行堆分析而不必重构它?