簡體   English   中英

為什么Java進程在多個循環中的速度會隨之降低?

[英]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是什么和做什么的情況下很難說,但是我可以想到許多可能的原因:

  1. 如果DataDigester.DoRun啟動一個新線程-則隨着線程數量的增加,每個線程的可用時間減少。 如果它利用硬件線程,則每個硬件線程從1個線程轉到2個線程后,時間將大大增加。

  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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM