2017-06-15 27 views
1

我有這個簡單的可觀測被稱爲:可觀察鏈模具上和IntelliJ時滯/凍結

Map<Integer, List<Long>> localLookup = new HashMap<>(); 
return Observable.from(userList) 
       .filter(lookupId -> userLookup.containsKey(lookupId)) 
       .map(lookupId -> { 
        int userId = userLookup.get(lookupId); 
        if (localLookup.containsKey(userId)) { 
         localLookup.get(userId).add(Long.valueOf(lookupId)); 
        } else { 
         localLookup.put(userId, Arrays.asList(Long.valueOf(lookupId))); 
        } 
        return lookupId; 
       }).toList().map(results -> { 
         return localLookup; 
       }); 

的用戶列表爲18000大小的List<String>的userLookup是預先存在的地圖,我創建一個新的映射基於userLookup中的內容。

不過,出於某種原因,在過濾器/映射的第十次和第二十次迭代之間,可觀察停止的執行發生,IntelliJ開始落後於瘋狂,並且直到我重新啓動時才真正恢復。我的內存設置相當高:

-Xms2048m 
-Xmx4096m 
-XX:ReservedCodeCacheSize=240m 
-XX:+UseCompressedOops 

我的堆指標沒有爆炸:enter image description here

其他唯一的指標是,我有打印的用戶ID列表的控制檯超長字符串。任何有關爲什麼這個觀察結果正在消失的想法?

+1

'/ simple/complex /',如果它非常簡單,你就可以推斷它爲什麼很簡單失敗... –

回答

3

Arrays.asList返回一個不可變列表,所以當您嘗試添加一個額外的userId時,您將獲得一個UnsupportedOperationException。所有的異常處理都可能導致重大的緩慢下降。

而不是使用Arrays.asList,創建一個new ArrayList,然後添加初始lookupId。