2012-01-19 143 views
2

我有一個完全使用Java編寫的Web應用程序。 Webapp不使用任何圖形/模型框架,而是使用模型視圖控制器。它僅由Servlet規範(Servlet版本2.4)完成。 自2001年開發的webapp,它非常複雜。最初是爲了與Tomcat 4.x/5.x一起工作而構建的。實際上,運行在Tomcat 6.x上。但是,我們仍然有內存泄漏。Java Web應用程序性能問題

在深度,web應用程序的規格可以恢復爲:

  • 用途的Servlet v 2.4規範。
  • 它不使用任何框架
  • 它不使用的JavaEE(不EJB)
  • 它基於JavaSE的(使用Servlet)只有
  • 在IE 6+(因爲它是年齡)

基礎設施規格

其實,webapp的工作在三種環境:

首先

  • IBM服務器(我不記得確切的型號)
  • 英特爾至強2.4GHz的
  • 32GB RAM
  • 1TB移動硬盤
  • 的Tomcat(第6版)配置使用8GB內存

第二個

  • 戴爾服務器
  • 英特爾至強2.0GHz的
  • 4GB內存
  • 500GB的硬盤
  • 的Tomcat(5.5版)被配置爲使用的RAM
  • 1.5GB

  • 戴爾服務器
  • AMD皓龍1214 2.20Ghz
  • 4GB內存
  • 320GB HDD
  • 的Tomcat(第6版)被配置爲使用的RAM
  • 1.5GB

數據庫規範

該Web應用程序使用SQL Server 2008 R2 Express Edition作爲DBMS,第一個服務器規範的用戶除外,該用戶使用SQ L Server 2008 R2標準版。對於連接池,應用程序使用Apache DBCP。

問題

那麼,它具有非常嚴重的性能問題。 Webapp不斷減速,並且多次拒絕服務。恢復應用程序的唯一方法是重新啓動Apache Tomcat服務。 在性能審計過程中,我發現了一些編程問題(如永不關閉的數據庫連接,超出使用Vector集合[而不是ArrayList])。

我想知道如何提高應用程序的性能,哪些應用程序可以幫助我監視Tomcat性能和Web應用程序內存使用情況。

所有的建議很樂意接受。

+1

魔法8球說:獨角獸! –

+0

您是否真的嘗試過找出瓶頸所在?堆轉儲找到內存泄漏?分析以查看是否有任何處理器週期耗盡?像[New Relic](http://newrelic.com/),如果減速只會隨着時間的推移而變得明顯?除了沒有定論的「審計」之外的任何事情? – millimoose

+0

什麼是Java內存參數? – Pushkar

回答

2

我會從一些可以幫助您分析應用程序的工具開始。由於您正在開發webapp,因此您需要從Lambda ProbeJava melody開始。

第一步是確定應用程序開始出現奇怪行爲的條件。問自己幾個問題:

  1. 性能問題是在應用程序啓動後還是加班後出現的?
  2. 性能問題是否與客戶請求數量相關?
  3. 什麼是真正的性能問題 - 服務器負載較高或內存不足(請注意它們是相關的,因此請檢查哪一個先啓動)
  4. 有沒有任何後臺進程正在執行某些大規模操作?他們是否計劃在特定時間段運行?

嘗試在深入代碼之前找到一些線索。它會幫助你縮小可能的原因。如Joshua Bloch在他的書「有效的Java」中所述 - 性能問題很少是源代碼中一些小錯誤的影響(當然,雖然Java構造的濫用會導致災難)。通常原因是糟糕的系統(API)體系結構。

基於我的經驗的最後一個建議 - 儘量不要認爲高內存消耗是不好的。 Tomcat將使用盡可能多的內存作爲操作系統,JVM將允許他(不超過最大設置)以及當它需要更多時 - Tomcat將執行垃圾收集。所以一個典型的(正確的!)內存消耗圖看起來像鋸。如果你正在處理內存泄漏,那麼圖形將不斷增加,但無限期地增加。這是最經常被誤解的內存泄漏,所以記住它。

說實話 - 我們無法幫到你。這些只是指針,現在你將不得不進行廣泛的研究,找出原因:)

+0

我曾經用Javamelody做過很多改進。你把它作爲一個servlet過濾器和一個JDBC代理。如果你使用了一些框架(例如EJB,Spring,Guice),它會容易得多。我也同意它看起來像內存泄漏。 –

+0

@ŁukaszBachman好吧,看起來不錯!我會看看這些工具。我有一個問題:確切地說,爲什麼「編程問題」不能成爲內存消耗/性能問題的主要原因? –

+0

@Astantler - 好吧,他們可能會,但他們往往不是:)我會給你發私人消息,評論太短;) –

0

好的。所以我看到巨大的Java應用程序運行較少的配置。您應該嘗試執行以下操作 -

  1. 首先將Profiler連接到您的應用程序,並查看應用程序的哪一部分花費最多時間。你可以使用JProfilerEclipse MAT(我個人比較喜歡JProfiler)。也試着看看最需要記憶的物體。這將有助於縮小您需要重寫的部分以提高性能。

  2. 一旦你已經採取了看看內存泄漏更新您的應用程序使用64位JDK(假設它已經沒有這樣做)

  3. 看看你的JVM參數並對其進行優化。

+0

好的,但我有一些關於你的問題: –

+0

1. 64位JDK:它是否改善了整體性能?有什麼區別?對不起,但我根本聽不懂。 2.優化Tomcat參數:這些是我在Tomcat 6中的參數: http://pastebin.com/ZM1bTHTf 最近,我添加了「-XX:GCTimeRatio = 9」來增加垃圾收集。我不知道這個說法是否改善了內存使用情況。 「優化它們」是什麼意思? –

1

通常的解決方案是使用例如輪廓儀等。 YourKit具有可重現問題的實際工作負載。

我要做的首先是CPU只有輪廓,內存只有輪廓終於在一次一個CPU &內存配置文件(我再看看CPU剖析結果)

YourKit還可以監測你的高級操作這樣的Java EE資源和JDBC連接。我沒有嘗試過這些,因爲我沒有使用它們。 ;)

它可以提高工作效率的好主意,即使它不是因爲它會降低這些配置文件的「噪聲」量,使您的問題比較明顯的問題的原因。

你可以嘗試增加可用的內存量,但一個懷疑這隻會拖延問題。

3

你也可以嘗試stagemonitor。它是一個開源的性能監控庫。它記錄請求響應時間,JVM度量標準,請求詳細信息,包括請求期間被調用方法的調用棧(配置文件)等等。由於開銷較低,您還可以在生產中使用它。

調諧過程將是如下。

  • 找出與該請求儀表盤 request dashboard
  • 緩慢請求分析與Request Detail Dashboard請求的堆棧跟蹤,以瞭解緩慢方法
  • 潛入你的代碼,並嘗試優化這些緩慢的方法
  • 您還可以將一些指標(如吞吐量或會話數量)與響應時間或CPU使用率相關聯
  • 分析堆用JVM Memory Dashboard

注:我stagemonitor的開發商。