2017-02-07 3 views
0

私はBig O Notationで宿題をしています。ますます多くの整数を持つリストを作成し、リストをソートしてどのBig O Collection.sort()がどれくらいかを判断するのにかかる時間を計算する必要があります。メモリ不足:Javaヒープスペース

私はこれを行うためのコードを書いており、ソート方法が各リストサイズのいくつかの反復の過程を引き継ぐ時間に関するデータを生成しています。

私は50,000の整数のリストをソートすることができますが、まったく同じ操作をやり直すとメモリが使い果たされます。私はガベージコレクタが私の記憶を取り戻すべきだと思うので、理論上は操作を繰り返すのに問題はないはずです。

大きな変数をnullに設定し、大きなリストへの参照をforループブロックの外に保存しないことについては読んだことがあります。私の整数リストへの参照を生かしておく必要はないと思います。

私はガベージコレクタが私の記憶を取り戻すことができないと間違っていますか?あなたがTesting t = new Testing(dataSize, thisList);を行うときに(私はこれは間違いだと思います)のコピーを参照 ので - -

 private static TreeMap<Integer, ArrayList<Long>> doExperiment(int iterations, int step, int trials, List listType) { 
    TreeMap<Integer, ArrayList<Long>> results = new TreeMap(); 
    for (int i = 1; i <= iterations; i++) { 
     // Data size ranges from 1000 - 50,0000 if step = 1000 and iterations = 50 
     int dataSize = i * step; 
     ArrayList<Long> trialResults = new ArrayList<Long>(); 
     for (int j = 1; j <= trials; j++) { 
      // This may be LinkedList, ArrayList depending on the parameter. 
      List thisList = listType; 
      // dataSize works up to 50,000 Integers. 
      Testing t = new Testing(dataSize, thisList); 
      long nanos = t.timedSort(); 
      // Prints a formatted string to standard output. 
      processResults(nanos, j, trials, i, iterations); 
      // The large list exists only within this Testing instance. Set it to null 
      t = null; 
      // Please, garbage collection Gods... 
      System.gc(); 
     } 
     results.put(dataSize, trialResults); 
    } 
    return results; 
} 
+0

'テストトン= ... 'についての何かして、'トン= null'なので、 'ループではないと思えます。まず第一に、 'System.gc()'は即時ガベージコレクションを保証しません。第二に何百回もGCを連続して実行したくないということです。私は起こっていることは、GCがすぐに実行されないので、まだ多くのテストのインスタンスで終わるということです。 'Testing t = null; 'をすべてのループの中から移動し、' t = null'と 'System.gc()'を削除します。 – kooker

+0

フルコードを教えてください。 'Testing'は何をしますか? 'processResults'は何をしますか?なぜあなたは 'trialResults'を使用していませんか?反復は何回ですか?あなたは 'iterations'数のArrayListを作成しています。あなたはその機能の結果で何をしていますか? – NickL

+0

あなたがしているのはあなたの並べ替えの実行のタイミングです、なぜあなたの並べ替えられたリストを返すのですか?ちょうどそれをして、リストを保存しないでください。 –

答えて

3

System.gc(); - ない保証ガベージコレクタ

List thisList = listType;を起動するには、これは実際におそらくあなたをTesting t = new Testing(dataSize, listType);

と同じですしたい:List thisList = new ArrayList(listType); - はい。これにより新しいリストが作成されますが、この場合、テストでは新しいリストが操作されますが、同じリストでは操作されません。 `にSystem.gc()が続く

ArrayList<Long> trialResults = new ArrayList<Long>(); // you create new list 
.... 
results.put(dataSize, trialResults); // do you want to put empty list in the result? 
+0

ニースキャッチ。これで問題は解決しました! listTypeは、ArrayListまたはLinkedListで実験を実行するかどうかをキャプチャするだけでした。つまり、新しいLinkedList()を渡します。私はより良いアプローチは、文字列またはブール値を使用し、その代わりに使用することだと思う。 –

+0

はい、私はtrialResultsにnanosを追加するつもりでした!再度ありがとう –

+1

JMH - http://openjdk.java.net/projects/code-tools/jmh/ - ベンチマークのための素晴らしいツール – iMysak

1
public static void main(String[] args) { 
     // TODO code application logic here 
     doExperiment(50000, 5, "ArrayList"); 
     doExperiment(50000, 5, "LinkedList"); 

    } 

    private static void doExperiment(int iterations, int trials, String listType) { 
     List list = null; 
     List<Long> holdStartTimes = new ArrayList(); 
     List<Long> holdEndTimes = new ArrayList(); 

     switch(listType) 
     { 
      case"ArrayList": 
       list = new ArrayList(); 
       break; 
      case "LinkedList": 
       list = new LinkedList(); 
       break;   
     } 

     for(int t = 0; t < trials; t++) 
     { 
      Random random = new Random(); 
      //create list with random ints 
      for(int i = 0; i < iterations; i++) 
      { 
       list.add(random.nextInt(50001));//random number in range from 0 to 50000 
      } 

      final long startTime = System.currentTimeMillis();//start Timer 
      holdStartTimes.add(startTime); 
      Collections.sort(list);//sort list 
      final long endTime = System.currentTimeMillis();//end Timer 
      holdEndTimes.add(endTime); 
     } 

     //sum times 
     long sum = 0; 
     for(int i = 0; i < holdStartTimes.size(); i++) 
     { 
      sum = sum + (holdEndTimes.get(i) - holdStartTimes.get(i)); 
     } 

     System.out.println("Sorting " + listType + " with " + iterations + " iterations and " + trials + " trials takes " + sum + " milliseconds."); 
    }