2008/6/2

關於java的Out of Memory--websphere

2007-08-21
關於java的Out of Memory(內存洩漏) - [workspace]

昨天項目上線測試發生了Out of Memory的JVM錯誤,導致系統down掉並且服務器文件系統撐爆。檢查原因是出現過多內存洩漏,系統的可用內存和性能持續下降;最終將導致內存不足 (OutOfMemory)。我們開發用的是IBM WebSphere平台,在websphere/AppServer下生成大量javacore*、heapdump*之類的文件,致使 websphere的垃圾回收功能失敗而導致。其中,javacore文件是關於cpu的,heapdump文件是關於內存的。

生產環境是 ibm小型機,按照手冊修改了:應用程序服務器 > server1 > 進程定義 > Java 虛擬機,將"最大堆大小(默認為 256)"改為768或1024以上。刪除文件系統中的javacore*,heapdump*後基本恢復正常。分析原因,一是JVM設置問題,二(最終原因)程序不夠健壯,很多資源沒有即時釋放導致資源撐爆。尤其是數據庫連接資源。以前也遇到過進程掛起的情況,與此次不同,進程掛起主要原因是SQL查詢不能及時返回結果導致頁面一直等待資源返回而掛起(suspend)。三是產生大數據量的結果集返回結果。一直懷疑我們用的數據結構不夠合理,但是也沒有嘗試修改。

總結一下:

關於架構應該使用健全的模式,使用資源後要及時釋放和回收垃圾;

儘量採用分佈式的結構,類似MVC模式;

努力從程序上解決根本問題。

附:轉載

WebSphere應用服務器內存洩漏探測與診斷工具

級別: 中級 李 學朝 (lixuec@cn.ibm.com), 高級軟件工程師,IBM中國軟件開發中心

2006 年 11 月 21 日

本文介紹了如何在WebSphere應用服務器中實現應用程序內存洩漏的探測,並且針對IBM所提供的系列分析與診斷工具,給出了具體的配置步驟和使用最佳實踐。
引言

內存洩漏是比較常見的一種應用程序性能問題,一旦發生,則系統的可用內存和性能持續下降;最終將導致內存不足(OutOfMemory),系統徹底宕掉,不能響應任何請求,其危害相當嚴重。同時,Java堆(Heap)中大量的對象以及對象間之複雜關係,導致內存洩漏問題的探測和分析均比較困難,採用相應的輔助工具是很必要的。

WebSphere應用服務器提供了系列針對內存問題的探測和分析診斷工具,這些工具可以幫助用戶進行內存問題的及時探測,保證系統在發生OOM之前,用戶可以在無須進行複雜分析的條件下,預知在其部署的應用中是否存在內存洩漏的問題。如果確有內存洩漏現象發生, WebSphere還提供了相應的工具,可以幫助用戶進行分析診斷,從而找到內存洩漏的真正原因。

1. 內存洩漏探測和診斷步驟

實踐中,我們可以採用以下的步驟來處理內存洩漏的問題:

(1) 首先,在WebSphere中我們啟用實時探測內存洩漏工具, WebSphere性能診斷顧問會對內存洩漏提前發出警告信息。

(2) 啟用WebSphere自帶的Tivoli性能查看器監視系統的JVM使用狀況,確定內存洩漏是否正在發生。

(3) 根據需要,生成詳細內存回收日誌,使用PMAT工具分析並確定洩漏的時間,週期等。

(4) 生成單個或者多個Heapdump文件,選用MDD4J進行分析診斷,找到內存洩漏的真正原因。

(5) 提交開發部門進行代碼修復,然後重新部署到WebSphere應用服務器。

接下來的部分,我們針對每個環節的配置和工具使用進行闡述。

2.WebSphere應用服務器中內存洩漏的探測工具

2.1 性能診斷顧問介紹

性能診斷顧問(Performance and Diagnostic Advisor),在WebSphere應用服務器6.0.2版本之前稱為運行時性能顧問(Runtime Performance Advisor)。該工具可以週期性的檢查WebSphere的設置,並給出調整的推薦值。自WebSphere應用服務器6.0.2版本開始,該工具實現了一種輕量級的內存探測機制,可以非常容易的幫助用戶探測是否在系統中存在內存洩漏問題,並提前通過日誌和管理控制台進行通知。這樣就給用戶以足夠的時間採取必要的措施防止系統宕掉,同時可以收集或生成相關的文件以進行離線的分析,來查找洩漏的根本原因。

2.2配置

可以在WebSphere應用服務器的管理控制台中啟用性能診斷顧問

(1) 訪問管理控制台 ->服務器-> 應用程序服務器。

(2) 選擇所要配置的服務器。

(3) 在性能區域,選擇性能和診斷顧問程序配置。

(4) 如圖所示,有兩個Tab, 運行時和配置。區別在於,運行時裡面的內容無須重啟服務器就可以生效,但下次重啟服務器的時候,這些配置也會丟失。配置Tab裡面的內容只有在服務器重啟後才生效,而且配置的內容也會一直存在,除非再次登陸並去掉所選項。

(5)在其他屬性區域,點擊性能和診斷建議配置,確保內存洩漏規則處於運行狀態(綠色箭頭)。

2.3 查看洩漏警告信息

WebSphere性能診斷顧問輸出信息可以顯示在WebSphere的管理控制台,並記錄在WebSphere應用服務器的SystemOut.log日誌文件裡面。

(1) SystemOut.log日誌

[8/31/06 13:21:43:545 CST] 00000010 TraceResponse W TUNE9001W: Heap
utilization patterns indicate that you may have a memory leak
Additional explanatory data follows.
Data values for free memory between 8/31/06 1:20 PM and 8/31/06 1:21 PM were
consistently below minimum required percentage.

(2) 管理控制台

-登陸管理控制台->故障診斷 ->運行時消息 ->點擊運行時警告

3. Java 虛擬機概要分析和詳細垃圾回收

進一步檢測是否有內存洩漏的發生,以及洩漏發生的時間,週期和速度,我們可以啟用Java虛擬機中的詳細垃圾回收,然後分析相應的日誌。 WebSphere應用服務器6.1使用了Java SDK5.0, 在Window, Linux, AIX, i5/OS,z/Linux 和z/OS上使用了IBM的JAVA虛擬機, 在Solaris和HP-UX上使用Sun的JVM。Java 虛擬機概要分析工具接口(Java Virtual Machine Tool Interface,JVMTI)支持從運行應用程序服務器的 Java 虛擬機(JVM)收集信息(如,關於垃圾回收的數據、對象利用和線程狀態)並且支持更全面的性能分析。一旦啟用了 JVMTI,可以使用 PMI 定製選項來啟用所選統計信息以收集特定數據。

3.1啟用 Java 虛擬機概要分析和詳細垃圾回收配置步驟

配置步驟:

1. 在控制台導航樹中單擊服務器 > 應用程序服務器

2. 單擊選擇所需應用程序服務器。

3. 在"服務器基礎結構"下,單擊 Java 和進程管理-> 進程定義。

4. 在"其他屬性"下,單擊 Java 虛擬機。

5. 選中配置Tab的詳細垃圾回收選項。

6. 在通用 JVM 參數字段中輸入 -agentlib:pmiJvmtiProfiler。

注: WebSphere6.1中,JVM概要分析接口改為Java Virtual Machine Tool Interface (JVMTI)。之前版本是JVMPI。如果需要JVMPI的時候,也可以此處輸入-XrunpmiJvmpiProfiler。另外,啟用JVMTI接口對性能影響較大,儘量避免在生產環境中使用。

7.點擊應用或者確定。

8. 單擊保存按鈕。

9.重啟WebSphere應用服務器。

3.2 GC數據分析工具PMAT

在WebSphere 應用服務器的日誌目錄下,native_stderr.log文件就是我們需要的內存回收分析文件。我們推薦使用IBM Pattern Modeling and Analysis Tool for Java Garbage Collector 工具,簡稱PMAT。 PMAT工具解析JAVA SDK的詳細內存回收(GC)日誌,並提供統計信息,圖表,分析並推薦Java堆配置。PMAT提供了豐富的圖形界面來顯示Java堆的使用狀況,從而更輕鬆地判斷是否有內存問題發生。該工具可以從IBM的alphaWorks網站下載,只有英文版。

我們可以把GC文件從服務器上下載到PMAT所在機器,然後根據WebSphere的平台選擇打開相應的GC文件進行分析。下面是一個GC日誌片斷,手動分析是比較費勁,而且需要深入瞭解JVM相關知識。

PMAT在分析GC日誌後,給出一個總結。下圖為例,我們可以看出GC對系統性能的影響,以及完成的垃圾回收次數等,並且我們可以看出工具給出的推薦(Recommendations)顯示系統的Java堆使用情況是持續增加的。

進一步,我們可以查看GC的詳情,點擊Analysis菜單,然後選擇Graph View All,我們就可以根據需要選擇所要查看的曲線。如圖所示,紅色曲線代表已使用內存,藍色曲線代表每次垃圾回收後可用的內存。已使用內存逐漸增加,可用內存的持續降低表明系統可能存在內存洩漏。

4. TPV監視JVM的狀況

另外一種方法是借助TPV和PMI來實時監視JVM,分析性能曲線來判斷是否有內存洩漏的狀況發生。 WebSphere性能監控基礎結構(PMI)和Java虛擬機概要分析工具接口(JVMTI)可以幫助我們收集系統的性能狀況數據,使用Tivoli性能查看器(TPV)以圖形的方式顯示這些數據(性能計數器),可以進一步證實是否系統正在發生內存洩漏。

4.1 PMI與TPV

PMI 提供WebSphere運行時和應用程序資源行為的一組全面的數據,。例如,PMI 提供數據庫連接池大小、servlet 響應時間、 Enterprise JavaBeans(EJB)方法響應時間、Java 虛擬機(JVM)垃圾回收時間以及 CPU 使用量等等。使用 PMI 數據,可以識別並修正應用程序服務器中的性能瓶頸, 還可使用 PMI 數據來監控應用程序服務器的運行狀況。PMI 數據可以由 Tivoli Performance Viewer(TPV)、其他 Tivoli 工具、您自己的應用程序或第三方工具來監控和分析。TPV 是隨 WebSphere Application Server 一起提供的 PMI 數據圖形查看器。

Tivoli Performance Viewer(TPV)使得我們可以通過查看圖表或表格,從而解讀WebSphere的性能監控基礎結構(PMI)數據。

4.2 PMI的配置方法

默認情況下,PMI已經開啟,級別是默認(Default)。配置步驟:

1. 在控制台導航樹中單擊監視&調整-> 性能監視基礎結構(PMI)。

2. 選擇所要配置的服務器名字。

3.單擊配置選項卡,這裡可以根據監控內容的需要,來選擇PMI的任一種統計信息集(無,基本,擴展,全部,定製)。我們這裡選擇"定製"。

註:如果在配置選項卡中,則當重新啟動服務器時應用設置。如果在運行時選項卡中,則立即應用設置。

4.點擊定製 -> 在定製監視級別的樹中,選擇配置選項卡,然後點開JVM運行時,可以根據需要,啟用或禁用相應的計數器。

5.保存並重啟WebSphere服務器。

4.3 TPV的使用方法

實時查看 TPV 性能模塊的步驟:

(1) 在控制台導航樹中,單擊監控和調整 -> 性能查看器 -> 當前活動 -> 服務器名字)-> 性能模塊。

(2) 選中要查看的每個性能模塊,例如JVM運行時。

(3) 單擊查看模塊按鈕。 在頁面的右側會顯示所選性能數據的圖形或切換成表格。註:每個模塊有與其關聯的多個計數器。這些計數器會顯示在數據圖形或表格下面的表中。您可以通過選擇或取消選擇計數器旁的複選框,將計數器添加到圖表或表中,或從中除去。

TPV顯示的已使用內存的圖形理想情況下應該是鋸齒狀,圖形中每個坡(下降)對應著一次內存的垃圾回收(Garbage collection),如下圖已使用內存的曲線,顯示的是沒有發生內存洩漏的狀況。

如果測試過程中出現如下情況,則有可能發生了內存洩漏:

-每次垃圾回收後的已使用內存的數值驟增。

-TPV對應的已使用內存圖形更接近於階梯(staircase),或者鋸齒形狀嚴重不規則。

-也可以查看分配的對象數與釋放的對象數之差值,如果這個數值越來越大,則有內存洩漏(如果需要查看對象數,需要啟用JVMTI接口並在PMI中啟用相應的JVM計數器)。

上圖,紅色曲線代表已使用的內存,從整體趨勢,我們可以看出已使用內存一直在增長。 TPV可以幫助發現內存洩漏,為了得到最優結果,我們可以重複試驗,而且每次可以增加測試的時間,例如測試1000,3000或5000個頁面請求。

5. 生成Heap dump文件

WAS6.1 中,在使用IBM JDK的平台上,可以直接使用以下的方法,隨時生成所需的heapdump文件。如果在性能診斷顧問程序配置裡面選中了"啟用自動堆轉儲收集,則可以自動在WebSphere profile所在的路徑下(例如/opt/IBM/WebSphere/WAS6.1/profiles/AppSrv01)生成heapdump文件,備用戶進行分析。

在使用IBM SDK的平台上,例如AIX, Linux和Windows,在啟用了性能診斷顧問工具後,如果探測到有內存洩漏發生,WebSphere會自動生成兩個heapdump文件,供後續分析使用。

我們在任何時候,可以隨時手動生成所需的heap dump文件。在WAS6.1 profile的bin目錄下,首先運行wsadmin 腳本客戶端,然後可以調用generateHeapDump操作來完成。

關鍵步驟:

1. 找到JVM對象名字。

set objectName
WebSphere:type=JVM,process=,node=<節點名字>,*]
2. 對JVM MBean調用generateHeapDump操作。

$AdminControl invoke $objectName generateHeapDump
例如:

[root@csspvm bin]# pwd
/opt/IBM/WebSphere/WAS6.1/profiles/AppSrv01/bin
[root@csspvm bin]# ./wsadmin.sh -username root -password demo4you
WASX7209I: Connected to process "server1" on node csspvmNode02 using SOAP
connector; The type of process is: UnManagedProcess
WASX8011W: AdminTask object is not available.
WASX7029I: For help, enter: "$Help help"
wsadmin>set objectName [$AdminControl queryNames
WebSphere:type=JVM,process=server1, node=csspvmNode02,*]
WebSphere:name=JVM,process=server1,platform=proxy,node=csspvmNode02,
j2eeType=JVM,J2EEServer=server1,
version=6.1.0.0,type=JVM,mbeanIdentifier=JVM,cell=csspvmNode02Cell,spec=1.0
wsadmin>$AdminControl invoke $ objectName generateHeapDump
/opt/IBM/WebSphere/WAS6.1/profiles/AppSrv01/./heapdump.20060904.075650.3576.phd
wsadmin>quit


理想情況下,在探測到問題時,盡快生成一個初始的heap dump,然後密切監控內存使用情況,等到洩漏了足夠的內存的時候,再生成另外一個heap dump,這樣可以對比分析以更準確地找到洩漏的原因。

註: 生成HeapDump文件的過程是比較耗資源的,所以請只在必須的時候做這樣的操作。

6內存洩漏的分析診斷工具-MDD4J

一旦確定了系統中有內存洩漏,並且為此生成了heap dump。接下來,我們可以把這些文件從WebSphere應用服務器轉移到離線的分析工具所在的機器,進行離線分析診斷。

6.1 工具介紹

MDD4J (Memory Dump Diagnostic for Java)是一個內存洩漏分析工具,用於對運行 WebSphere Application Server 的虛擬機(JVM)所生成的常用內存轉儲(堆轉儲)格式進行分析。進行內存轉儲(Memory dump)分析的目的,是為了確定 Java 堆中真正導致內存洩漏的類和包(classes and packages),這樣可以縮小內存洩漏的範圍並找到真正的原因,此分析還確定應用程序 Java 堆佔用量的主要組成部分以及它們之間的擁有關係。

此工具支持下列格式的內存轉儲格式有:

-IBM 的PHD格式(heapdump.phd)

-IBM 文本堆轉儲(heapdump.txt)

-HPROF 堆轉儲格式(hprof.txt,主要針對Solaris和HP-UX平台)

-SVC 轉儲(dump.bin,IBM z-Series上的WebSphere)

該工具提供了兩種分析機制:單轉儲分析以及對兩個轉儲進行的比較分析。

單轉儲分析最常用於在發生 OutOfMemoryException 時自動觸發的內存轉儲。此類分析查找可疑的數據結構,能夠相對快速地提供可疑洩漏對象的分析結果。

比較分析用於對運行內存洩漏應用程序期間(即可用 Java 堆內存流失時)獲取的兩個內存轉儲進行分析。在運行洩漏應用程序的早期觸發的內存轉儲被稱為基線內存轉儲,發生洩漏的應用程序運行一段時間(以允許洩漏程度加大)後觸發的內存轉儲被稱為主內存轉儲。在發生了內存洩漏的情況下,主內存轉儲可能包含大量對象,而這些對象佔用的 Java 堆空間量會比基線內存轉儲大很多。

為了獲得更好的分析結果,建議使主內存轉儲的觸發點與基線內存轉儲的觸發點在時間上拉開一定距離,從而使總耗用堆大小在兩個觸發點之間大幅增長。

MDD4J的分析結果顯示是基於WEB界面的,具有下列特徵:

- 列示分析結果、堆內容、大小和增長幅度的總結

- 列示可疑的數據結構、數據類型和包,它們是造成堆使用量增加(對於比較分析)和堆大小較大(對於單轉儲分析)的主要原因。

- 擁有關係上下文視圖顯示了佔用量主要組成部分之間的關係,以及一組彙總的主要佔用量組成部分所包含的重要數據類型。

- 在堆轉儲內容的交互式樹形視圖中,瀏覽功能能夠顯示堆中任何對象的所有進入引用(在樹中只顯示一個引用,其餘引用單獨顯示)和外出引用,而子對象按到達大小排序。

- 導航功能使您能夠從可疑對象列表轉到所有關係上下文,以及從內容視圖轉到瀏覽視圖。

- 提供了內存轉儲中所有對象和數據類型的表視圖,視圖中具有過濾器和經過排序的列。

6.2工具的使用

WebSphere 應用服務器v6.1的附帶光盤裡面有IBM Support Assistant工具的安裝文件,運行相應的安裝文件,MDD4J作為插件同時被安裝了。

另外,也可以從IBM 技術支持站點http://www-306.ibm.com/software/support/isa/ 下載Support Assistant工具,然後選擇更新程序,獨立安裝MDD4J插件。

啟動步驟:

(1) 程序->IBM Support Assitant ->IBM Support Assistant v3

(2) 在Support Assistant窗口中,選擇工具 -> 選擇WebSphere版本號。

點擊MDD4J的鏈接,就可以開啟MDD4J工具。在該界面中,我們可以提交單個heap dump文件進行單轉儲分析,或同時提交兩個文件進行比較分析。也可以從內存轉儲分析結果的下拉選項中選擇以前的分析結果,從而查看以前的分析內容。

查看分析進度

單擊"上載並分析"按鈕後,MDD4J開始分析heap dump文件。在分析執行過程中,登錄頁面將自動刷新,以反映當前正在執行的分析步驟以及整體分析進度。如果該頁面由於某種原因而不刷新,您可以單擊"刷新"按鈕以瞭解當前分析狀態。如果您希望停止分析,可以單擊"停止"按鈕,這將在當前正在執行的模塊完成後終止分析。

在提交了heap dump文件,MDD4J顯示分析狀態。

查看分析結果

分析完成後,Mdd4J頁面將重定向到"分析結果"頁面。"分析結果"頁面包含 4 個選項卡:

"分析總結"選項卡:顯示分析結果總結,並列示下一組用於查看分析結果的步驟。

"可疑對象"選項卡:它顯示四類可疑對象,即對增長幅度影響最大的數據結構、到達大小顯著流失的數據結構、有大量實例的對象類型以及有大量對象實例的 Java 包。

"察看上下文和內容"選項卡:顯示主內存轉儲中 Java 堆佔用量的主要組成部分的擁有關係上下文圖,以及圖中所選節點的內容。

"瀏覽"選項卡:根據對對象引用圖執行的深度優先遍歷,用樹形視圖顯示主內存轉儲的所有內容。

其他內容,請參照MDD4J工具附帶的Help文檔,該幫助文檔有詳細的使用說明,在此不再贅述。

7.小結

IBM 提供了一系列的工具輔助用戶進行內存問題的監控和分析,在合適的階段選擇合理的工具可以幫助我們輕鬆搞定內存洩漏。這裡介紹的工具都是WebSphere 附帶或者免費的,IBM Tivoli工具還提供了更強大的監控和診斷功能,例如ITCAM (IBM Tivoli Composite Application Management),可以根據實際情況選用。

沒有留言:

JPA+complex key+custom Query

  來源: https://www.cnblogs.com/520playboy/p/6512592.html   整個來說,就是有複合主鍵 然後要使用  public interface XxXXxx DAO extends CrudRepository<Tc...