[英]Why the speed of a Java process inside multiple loops slows down as it goes?
我在多核Intel工作站上使用Win 7,Java 8。 我有這樣的事情:
int SampleWeeksArray[]=new int[]{23,25,33},IdArray[]=new int[]{0,1,2};
for (int StartDay=25;StartDay<36;StartDay++)
for (int SampleWeeks : SampleWeeksArray)
for (int Id : IdArray)
for (float ValueFactor=0.08f;ValueFactor<0.13f;ValueFactor+=0.01)
{
DataDigester dataDigester=new DataDigester();
dataDigester.StartDay=StartDay;
dataDigester.SampleWeeks=SampleWeeks;
dataDigester.Id=Id;
dataDigester.ValueFactor=ValueFactor;
dataDigester.DoRun();
}
在dataDigester.DoRun()內部,它讀取一些文本數據文件,解析每一行並使用數組,向量和哈希圖進行一些統計,並使用ThreadPoolExecutor運行多個進程,然后將結果保存到文件中。
奇怪的是,DoRun()的每次運行僅需10分鍾,但是在循環內部,它的運行時間為10分鍾。 但逐漸減慢到20、30分鍾。 對於每個DoRun()。
如果我花30分鍾停止了循環,然后從停下來的地方重新開始,又花了10分鍾。 並最終減慢到20、30分鍾。 再次。 為什么呢
我什至在DoRun()之后添加了以下幾行,但它並沒有提高速度,但仍然放慢了速度:
Thread.sleep(20*1000); // Rest for 20 seconds
System.gc();
在每個循環中,DataDigester dataDigester = new DataDigester()創建一個新對象,應該在DoRun()之后將其回收,為什么它變慢了?
我還從Windows任務管理器中注意到,隨着循環的不斷進行,內存使用量增加了。 看來Java會以某種方式使自身負擔加重並放慢速度,因此在這種情況下,如何將速度保持在恆定的10分鍾。 對於循環內的每次運行?
在不知道DataDigester是什么和做什么的情況下很難說,但是我可以想到許多可能的原因:
如果DataDigester.DoRun啟動一個新線程-則隨着線程數量的增加,每個線程的可用時間減少。 如果它利用硬件線程,則每個硬件線程從1個線程轉到2個線程后,時間將大大增加。
DataDigester可能具有添加的靜態結構,並且添加到其中的數量越多,增長的速度就越慢
僅聲明一個DataDigester
並將其重復用於所有循環,而不是創建成千上萬的循環。
int SampleWeeksArray[]=new int[]{23,25,33},IdArray[]=new int[]{0,1,2};
DataDigester dataDigester;
for (int StartDay=25;StartDay<36;StartDay++)
for (int SampleWeeks : SampleWeeksArray)
for (int Id : IdArray)
for (float ValueFactor=0.08f;ValueFactor<0.13f;ValueFactor+=0.01)
{
dataDigester=new DataDigester();
dataDigester.StartDay=StartDay;
dataDigester.SampleWeeks=SampleWeeks;
dataDigester.Id=Id;
dataDigester.ValueFactor=ValueFactor;
dataDigester.DoRun();
}
}
}
}
那應該可以解決您的垃圾回收問題和時間安排。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.