最近生產環境的系統在運行一段時間后,用戶登錄速度越來越慢,但是重啟某一模塊后,用戶登錄恢復正常。如此反復,令人提心吊膽。於是下定決心,找出問題原因。
趁着系統運行低峰期,打印出相應Dump文件,發現Dump文件中在ArrayListMultimap對象處包含大量HashMap$Entry,由於涉及信息安全,在這里就不粘貼其對應的Dump數據了。分析存在問題的代碼發現原作者引用了如下數據結構:
Multimap<Long,Long> syncMap = ArrayListMultimap.create();
但是根據原代碼的業務邏輯,此處的(key,value )應當是不允許重復的。基於此分析,基本可以確定此處為對象誤用:將HashMultimap誤用為ArrayListMultimap.
那么ArrayListMultimap與HashMultimap在對象去重上有啥區別呢?下面以示例來進行說明:
一、ArrayListMultimap存儲對象
Multimap<String,String> multimap= ArrayListMultimap.create(); multimap.put("Fruits","Banana"); multimap.put("Fruits","Apple"); multimap.put("Fruits","Apple"); int size=multimap.size(); #3 System.out.println(size); Collection<String> fruits = multimap.get("Fruits"); #[Banana,Apple,Apple] System.out.println(fruits);
二、HashMultimap存儲對象
Multimap<String,String> multimap= HashMultimap.create(); multimap.put("Fruits","Banana"); multimap.put("Fruits","Apple"); multimap.put("Fruits","Apple"); int size=multimap.size(); #2 System.out.println(size); Collection<String> fruits = multimap.get("Fruits"); #[Banana,Apple] System.out.println(fruits);