2011-05-02 38 views
0

我正在開發一個基於Web的組件,它將用Java開發。其中的一部分基於web服務,而另一部分則具有Spring-MVC框架和Hibernate持久層。如何防止組件設計階段內存泄漏?

我仍在設計過程中 - 準備用例,活動圖和序列圖。

我只是想知道什麼是確保設計本質上沒有可能導致內存泄漏的具體方法。遵循正確的編碼準則,然後進行代碼審查可以確保程序中不存在內存泄漏,但是設計級別如何。我們是否有一些方法來設置帽子,這樣開發者就不必瘋狂地想象一下,防止泄漏。

欣賞任何建議。

感謝, Ujj​​wal

+0

在Java中,你必須編程真的很糟糕才能獲得任何內存泄漏:-) – 2011-05-02 10:39:08

+0

不是那麼容易,兩個簡單的問題與HashMap和ThreadLocal有關,問題是內存用C/C++泄漏,錯誤顯示得很快,在Java中,它可能需要飛蛾撲火。 – Pih 2011-05-02 11:09:23

回答

2

大多數內存泄漏是由實現故障發生的,在Java中最多基於對所用技術的不充分理解。 (例如4種不同類型的內部類)

幫助這裏的唯一方法是將時間和金錢花在開發人員的技能上。 - 最佳讀物Effective Java Second Edition by Joshua Bloch

其他導致經常記憶韭菜的區域是併發性。 - 據我所知,處理這個(和其他併發問題)的最好方法是定義哪些組件需要在執行時保存(以及哪些組件在單個線程環境中運行)。如果他們需要線程保存實現,那麼定義BEFORE實現誰是確切的,他們確保它們是線程保存(哪個函數和方法由什麼保護)。

你可以在設計中做最後一件事,注意靜態字段。

另一個認爲你可以通過設計來做的事情就是建立一個看門狗。如果你有(例如)一個動態列表,當列表中的某些項目丟失時它不是一個大問題,並且你知道該列表可能導致一些麻煩(線程或實現失敗),比實現一個如果清單變得比您預期的要大得多,那麼清單就是清單。 (然後:修復導致問題的錯誤!) - 這樣一個列表的例子可能是證券交易所GUI更新事件列表(在一個沒有股票的相關網站中)。如果一次課程更新沒有發送給客戶端,而是下一次(一秒鐘後),那麼丟失一次更新比崩潰整個服務器要好得多。

1

一個內存泄漏在Java中最常見的情況是與緩存:

Map<String, Connection> userConnection = new HashMap<String, Connection>(); 
// cache connections: 
userConnection.put("User X", connectionInstance); 
// connectionInstance is closed but never the userConnection.remove("User X") is called. 

當連接被關閉時,該映射不被清除,具有內存泄漏。

回答你的問題,放在你的指導線上,使用WeakHashMap(http://download.oracle.com/javase/6/docs/api/java/util/WeakHashMap.html)進行緩存而不是使用「普通」HashMap。

+0

+1 - 一旦你增加了用戶的負載/數量,這通常會在幾個月後崩潰。 – SimonJ 2011-05-02 11:01:00

0

我不相信你可以防止設計階段的內存泄漏。但是使用傳統的負載測試工具,如JMeter/Grinder/Loadrunner等可以幫助發現內存泄漏,以便在發佈之前對其進行修復。

性能測試應該參與開發過程的每一步,就像單元測試和集成測試一樣。

0

加載系統只是揭露資源泄漏挑戰的一半。第二個挑戰是建立適當的監視器和診斷工具系統,以瞭解資源是如何使用的,並可能受到影響。

最終資源泄漏實際上分爲四大類:內存,磁盤,網絡和CPU。無論您是在查看應用代碼,諸如Java或數據庫之類的客戶操作系統還是核心操作系統,您可以收集的所有指標都是這些項目的子集。

由於監控可能會對系統造成負擔性能工程人員往往會忽視頂級統計信息,直到發現問題,然後在針對核心和客戶的已識別資源泄漏的類中部署更深層次的監控OS找出可能的原因。

如果您正在尋找一些輕量級的深度診斷功能,可以幫助您重新進入單元測試和組件裝配階段,然後通過性能測試工作一直攜帶相同的工具,那麼我可以推薦解決方案這個組織,http://www.rtiperformance.com/

詹姆斯滑輪

主持人:SQAForums LoadRunner的| WinRunner的,Google網上論壇LR-LoadRunner的,YahooGroups LoadRunner的|高級 - LoadRunner的,LinkedIn LoadRunner的(老闆)| LoadRunnerbyTheHour(所有者)