背景:
此系統功能上大抵分為兩部分,乙個是web的管理平台,其二是定時檢測、路由、轉換傳送報文的後端功能。系統主要計算在後端功能。管理平台的使用量很小,基本是配置及狀態檢視。
現象:在測試資料中,處理5萬單的檔案。據相關開發人員描述,系統記憶體洩漏,系統執行越來越慢。
檢視:由開發人員提供的函式執行時間統計表來看,函式的平均執行時間並沒有明顯的降低。(此處開發人員將關注點放在了總時間)
經過使用工具檢視,系統的記憶體使用持續增加,一直沒有回落,兩個小時內一直穩定在2g左右。
思路:1、記憶體穩定2g不再增長,有可能是測試資料量的問題,也可能是記憶體使用基準就是2g,後續基本不再增長。
所以,最好再增長資料量做一次測試,以進一步確認。
2、假設記憶體洩漏,那麼通過檢視堆疊資訊。由jvisualvm.exe檢視例項數量統計,發現除了integer,char等基礎型別數量非常大。而與系統有關的類的例項很少,或者處在迴圈中,有穩定的波動。
聯想到可能有程式設計師定義全域性的字段,導致一直累加增長。
通過關鍵字查詢,未發現有此類現象。
再檢視列表,除了基礎資料型別多之外,hashmap及hashmap$entry的例項也很多,達到百萬個例項。通過檢視工程**,使用到map的地方一般都在函式內的區域性變數,不可能造成這麼多的例項。
最後採用隨機的方式,檢視map所關聯的例項,發現都與hqlparser有物件相關。
由此聯想到,可能是開發時,一些sql或者hql採用拼字串的方式,且沒有使用佔位符。猜想hibernate內部可能對這些sql/hql的語句進行一些快取。導致hashmap的例項量劇增。
(最後通過測試,證實確實是此問題。錯誤的開發習慣導致的效能問題不是重點,重點是記錄一些查詢問題的過程與思路)
系統效能優化(一)
我們都知道在實際做專案時,有一條 原則,就是先實現其功能,在優化其效能。當我們功能都沒有實現的時候,就考慮其效能優化,想一次性就寫出效能最好的方案,顯然是非常有難度的,所以我們先將其功能實現,再逐步優化。假設現在我們想實現乙個最基礎的相關錯題複習的功能,如我們在網上進行刷題的時候,當我們做錯一到題目...
優化系統效能
程式框架 hibernate3 struts2 spring2 資料庫 sqlserver2008 伺服器 tomcat6 優化方法 1 配置連線池 採用的c3p0連線池 2 在程式中獲取列表時,用iterator代替list 3 在查詢之後可以使用session.clear 方法釋放快取 4 用資...
系統效能分析
當系統變慢時候,我們首先關注的可能是cpu的指標,有時候發現cpu使用率一點都不高,但是系統還是卡,這時可能就需要關心另外乙個影響效能的東西 磁碟的io效能。通過top命令中的 wa可以獲取系統當前的io狀態,如果該值居高不小,那磁碟的io可能就有問題了。另外可以通過iotop命令來詳細了解什麼程式...