1、Servlet中利用init()方法進行快取
當應用伺服器初始化servlet執行個體之後,為用戶端請求提供服務之前,它會調用這個servlet的init()方法。在一個servlet的生命週期中,init()方法只會被調用一次。通過在init()方法中緩衝一些靜態資料或完成一些只需要執行一次的、耗時的操作,就可大大地提高系統效能。
實驗結果:
有用Init比沒用Init要快點:
0.465 VS. 0.591
可在Jconsole中觀察JVM的記憶體使用量情況
沒用Init的話,記憶體逐漸上升,用了Init的話,記憶體比較平穩
2、在web.xml中禁用自動重新載入
<Context docBase="F:/PetWeb" reloadable="false" path="/Pet"/>
其中reloadable="false"表示當應用程式中的內容發生更改之後伺服器不會自動載入,這個屬性在開發階段通常都設為true,方便開發,在發布階段應該設定為false,提高應用程式的訪問速度。docBase為路徑,可以使用絕對路徑,也可以使用相對路徑,相對路徑相對於webapps。path屬性的值是訪問時的根地址。訪問地址如下:http://localhost:8080/Pet/
3、不要濫用HttpSession
在很多應用中,我們的程式需要保持用戶端的狀態,以便頁面之間可以相互聯絡。但不幸的是由於HTTP具有天生無狀態性,從而無法儲存用戶端的狀態。因此一般的應用伺服器都提供了session來儲存客戶的狀態。在JSP應用伺服器中,是通過HttpSession對像來實現session的功能的,但在方便的同時,它也給系統帶來了不小的負擔。因為每當你獲得或更新session時,系統者要對它進行費時的序列化操作。你可以通過對HttpSession的以下幾種處理方式來提升系統的效能。
如果沒有必要,就應該關閉JSP頁面中對HttpSession的預設設定。 如果你沒有明確指定的話,每個JSP頁面都會預設地建立一個HttpSession。如果你的JSP中不需要使用session的話,那可以通過如下的JSP頁面指示符來禁止它:
<%@ page session="false"%>
不要在HttpSession中存放大的資料對像:如果你在HttpSession中存放大的資料對像的話,每當對它進行讀寫時,應用伺服器都將對其進行序列化,從而增加了系統的額外負擔。你在HttpSession中存放的資料對像越大,那系統的效能就下降得越快。
當你不需要HttpSession時,儘快地釋放它:當你不再需要session時,你可以通過調用HttpSession.invalidate()方法來釋放它。盡量將session的逾時時間設得短一點:在JSP應用伺服器中,有一個預設的session的逾時時間。當客戶在這個時間之後沒有進行任何操作的話,系統會將相關的session自動從記憶體中釋放。逾時時間設得越大,系統的效能就會越低,因此最好的方法就是盡量使得它的值保持在一個較低的水平。
4、將頁面輸出進行壓縮
方法一、是有的容器(伺服器)提供的功能,但這個局限於特定容器。比如 apache+tomcat 或者 resin-pro 版 。
方法二、是部署前手動 gzip 壓縮,配合 servlet 過濾器使用,這個能實現 gzip 功能,但是降低了靈活性。
實驗:
在Servelet中編寫壓縮過濾器,然後在HTTPWatch中觀察壓縮前跟壓縮後資料轉送量和傳輸速度的差異
需要注意容器在處理壓縮時需要佔有較多記憶體,原始響應被複製到JVM記憶體中,然後運行壓縮演算法,演算法本身需要動用一定量的記憶體來建立並處理中間資料。
參考:
http://lylhelin.javaeye.com/blog/821957
http://tdcq.javaeye.com/blog/453644
5、使用線程池
應用伺服器預設地為每個不同的用戶端請求建立一個線程進行處理,並為它們指派service()方法,當service()方法調用完成後,與之相應的線程也隨之撤消。由於建立和撤消線程會耗費一定的系統資源,這種預設模式降低了系統的效能。但所幸的是我們可以通過建立一個線程池來改變這種狀況。
另外,我們還要為這個線程池設定一個最小線程數和一個最大線程數。在應用伺服器啟動時,它會建立數量等於最小線程數的一個線程池,當客戶有請求時,相應地從池從取出一個線程來進行處理,當處理完成後,再將線程重新放入到池中。如果池中的線程不夠地話,系統會自動地增加池中線程的數量,但總量不能超過最大線程數。通過使用線程池,當用戶端請求急劇增加時,系統的負載就會呈現的平滑的上升曲線,從而提高的系統的延展性。
6、選擇正確的頁麵包含機制
在JSP中有兩種方法可以用來包含另一個頁面:
(1)使用include指示符
<%@ include file="test.jsp" %>
(2)使用jsp指示符
<jsp:include page= "test.jsp" flush="true"/>
在實際中發現,如果使用第一種方法的話,可以使得系統效能更高。
因為第一種是在編譯階段執行include,將與主jsp的Servlet融合在一起。而第二種則是在請求處理階段執行。
7、正確地確定javabean的生命週期
JSP的一個強大的地方就是對javabean的支援。通過在JSP頁面中使用<jsp:useBean>標籤,可以將javabean直接插入到一個JSP頁面中。它的使用方法如下:
<jsp:useBean id="name" scope="page|request|session|application" class="package.className" type="typeName"></jsp:useBean>
其中scope屬性指出了這個bean的生命週期。預設的生命週期為page。如果你沒有正確地選擇bean的生命週期的話,它將影響系統的效能。
舉例來說,如果你只想在一次請求中使用某個bean,但你卻將這個bean的生命週期設定成了session,那當這次請求結束後,這個bean將仍然保留在記憶體中,除非session逾時或使用者關閉瀏覽器。這樣會耗費一定的記憶體,並無謂的增加了JVM垃圾收集器的工作量。因此為bean設定正確的生命週期,並在bean的使命結束後儘快地清理它們,會使用系統效能有一個提高。
實驗:
編寫JSP頁面引用Bean,用不同的scope指出這個bean的生命週期,然後用JProfiler查看對象在記憶體中的存活周期。
參考:
http://hi.baidu.com/netpet/blog/item/7501ae4498b00882b3b7dc05.html