2010-10-19 71 views
1
private ArrayList<HashMap<String, String>> sortArrayMap(ArrayList arrList) 
    { 
     ArrayList retArray = new ArrayList(); 
     Hashtable tableUnOrdered = new Hashtable(); 

     for (int i = 0; i < arrList.size(); i++) 
     { 
      HashMap<String, String> map = (HashMap<String, String>) arrList.get(i); 
      tableUnOrdered.put(map.get("TCNT"), i); 
     } 
     Vector v = new Vector(tableUnOrdered.keySet()); 
     Collections.sort(v); 
     for (int j = 0; j < MAX_ITEMS_PER_GRAPH && j < v.size(); j++) 
      retArray.add(v.get(j)); // add the list in the needed order 

     return retArray; 
    } 

我無法找出此代碼中發生內存泄漏的位置,任何人都可以讓我知道這一點。我的老闆說這段代碼有內存泄漏,並要求我查明。此代碼中的內存泄露?

+0

你是什麼意思_「內存泄漏」_?什麼症狀? – 2010-10-19 11:59:23

+0

我想,這段代碼沒有內存泄漏。爲什麼你認爲有?請發送「jstat -gcutil」的結果。當然,大家都知道Java是一個大內存泄漏;-)我認爲問題在於堆大小。 – iddqd 2010-10-19 12:08:35

+0

對數組映射進行排序?爲什麼不使用TreeMap? – 2010-10-19 12:39:07

回答

1

它壞了:我清理了泛型,它沒有返回一個HashMap列表,它返回一個字符串列表。

private ArrayList<HashMap<String, String>> sortArrayMap2(ArrayList<HashMap<String, String>> arrList) 
{ 
    ArrayList<HashMap<String, String>> retArray = new ArrayList<HashMap<String, String>>(); 
    HashMap<String, Integer> tableUnOrdered = new HashMap<String,Integer>(); 

    for (int i = 0; i < arrList.size(); i++) 
    { 
     HashMap<String, String> map = arrList.get(i); 

     tableUnOrdered.put(map.get("TCNT"), i); 
    } 
    Vector<String> v = new Vector<String>(tableUnOrdered.keySet()); 
    Collections.sort(v); 
    for (int j = 0; j < MAX_ITEMS_PER_GRAPH && j < v.size(); j++) 
     retArray.add(v.get(j)); // add the list in the needed order 

    return retArray; 
} 
+0

這從你身邊得到了很大的幫助......單獨提出的幾個問題1.什麼是TCNT,自定義比較器在哪裏,這段代碼是否被破解,以及之前代碼的優點是什麼。 – John 2010-10-19 13:27:31

+0

可以幫助我在這個代碼也,我認爲這將是一個偉大的一天對我來說http://stackoverflow.com/questions/3968553/does-these-code-has-memory-leakage – John 2010-10-19 13:29:31

+0

沒有優勢:此代碼不會甚至不會*編譯*,因爲add()操作嘗試插入String而不是HashMaps 。然而,這意味着代碼可能不會做你認爲它所做的事情。我不知道什麼TCNT比它應該被添加到arrList中的所有地圖上的關鍵字更多。我認爲你需要回到你的老闆那裏,向有經驗的編碼員尋求幫助 - 這段代碼只是混淆和錯誤的。 – KarlP 2010-10-19 13:36:06

5

就我所見,這種方法並沒有在某些封閉類字段上保存引用,因此它不會導致內存泄漏。

+0

你是什麼意思?你可以多解釋一下 – John 2010-10-19 12:05:50

+3

@John,它只使用方法局部變量,它會在方法返回後自動收集垃圾。如果在應用程序的生命週期中保留對某些對象的引用,內存只能在Java中泄漏。實際上,唯一的方法是(直接或間接)在「靜態」類成員字段中保留引用。但是這個代碼中沒有使用字段。 – 2010-10-19 12:07:24

1

除了參數以外,所有變量都在方法範圍內。當方法終止時,它們將被標記爲垃圾回收。

1

問你的老闆是否真的意味着內存泄漏,或者他是否意味着它使用了太多的內存。告訴他有很大的不同,你需要知道他擔心的是什麼。