簡單-高效-優雅

          [轉帖]定位應用程序中對大對象的申請

          用戶在使用WebSphere Application Server(以下簡稱WAS)運行自己應用的時候經常會碰到Out Of Memory的問題(簡稱OOM問題)。其中很大一部分的情況是應用程序分配大對象造成的Java堆空間碎片問題。因此,如何快捷準確的找到分配大對象的 方法并加以改進是解決這類問題的關鍵。
          本文會給出一個工具(swprof),針對WAS給出定位分配大對象的方法。需要注意的是該工具的啟用可能會消耗大量的CPU計算資源,所以建議在測試環境中使用。

          當用戶在使用WAS的時候碰到了分配大對象引起的碎片問題。找到造成分配失敗的線程堆棧信息對于解決問題將會是非常有幫助的。本文提供的工具可以幫助用戶:
          ● 打印分配失敗的線程堆棧信息
          ● 通過設置分配失敗的內存大小,限制堆棧信息的打印
          ● 通過設置方法調用的深度,限制堆棧信息的打印
          需要注意的是,這個工具在某些情況下可能無法報告堆棧中方法的準確名字。在這種情況下,用戶需要通過其他機制找到大對象的分配方法或者聯系本地的IBM技術支持。

          為了使用本工具,用戶首先需要按照下面的步驟配置java虛擬機,使其能夠加載所需的類庫:
          1.從下面的連接中找到并下載Profiler.zip。展開這個壓縮文件,可以看到Profiler.zip包含多個壓縮文件。找到對應操作系統的壓縮 文件,比如:swprof_Windows.zip對應Windows操作系統,展開并得到對應的類庫文件,比如:libswprof.so或者 liballocprof.so或者swprofiler.dll??截愵悗煳募?lt;WAS_Home>"java"jre"bin路徑下。
          http://www-1.ibm.com/support/docview.wss?uid=swg21162314&aid=1
          其中<WAS_Home>代表WAS的安裝目錄。
          注意:這些類庫文件針對每個操作系統是不同的,確保找到與操作系統對應的類庫文件并拷貝到指定的路徑下。
          2.對于AIX、Linux、Linux on zSeries、Windows平臺上的WAS,在Java虛擬機的命令行參數中添加:-Xrunswprof。對于Solaris平臺上的WAS,在 Java虛擬機的命令行參數中添加:-Xrunallocprof。添加的具體辦法請參考WAS的信息中心:
          http://www-306.ibm.com/software/webservers/appserv/was/library/
          3.重新啟動應用服務器
          4.如果,類庫被成功的加載,那么在應用服務器啟動過程的stderr日志中(比如:native_stderr.log)可以看到類似如下的信息:
          swprofiler loaded OK
          Allocation limit: XXXX, Depth: YYY
          為了更好的利用該工具,用戶可以定制打印堆棧的分配大小和深度。其中分配大小通過設定環境變量ALLOC_LIMIT來定制;分配深度通過設定變量 ALLOC_DEPTH來定制。每當應用程序嘗試分配超過分配限制大小的對象時,工具就會在應用服務器的stderr日志中(比 如:native_stderr.log)打印申請這個對象的方法信息。分配深度控制著堆棧被打印的層數。兩者的默認值是50000和20。這就意味著, 默認情況下當某個應用嘗試分配超過50000個字節大小的對象時,工具將打印堆棧的頭20層方法。例如:
          ……
          <AF[591]: Allocation Failure. need 22616440 bytes, 6476 ms since last
          AF>
          <AF[591]: managing allocation failure, action=2 (118062832/674101760)>
          <GC(591): GC cycle started Fri Dec 09 08:19:50 2005
          <GC(591): freed 481241408 bytes, 88% free (599304240/674101760), in
          105 ms>
          <GC(591): mark: 90 ms, sweep: 15 ms, compact: 0 ms>
          <GC(591): refs: soft 3 (age >= 32), weak 0, final 21, phantom 1>
          <AF[591]: completed in 106 ms>
          Large object allocated: size 22616428
          at testalloc in class com/test/OOMTest 21616424
          at service in class javax/servlet/http/HttpServlet
          ……
          用戶可以按照如下的方法設定這2個環境變量:
          WAS V6.0:
          1. 登陸WAS管理控制臺依次選擇:
          服務器 > 應用服務器 > 服務器名稱(比如:server1)> Java和進程管理 > 進程定義 > 環境條目 > 新建
          2. 添加如下的環境變量和值:
          名稱 值
          ALLOC_LIMIT 限定的字節數(比如:600000)
          ALLOC_DEPTH 限定的堆棧深度(比如:10)
          3. 保存設置重新啟動應用服務器

          WAS V5.0 & 5.1:
          1. 登陸WAS管理控制臺依次選擇:
          服務器 > 應用服務器 > 服務器名稱(比如:server1)> 進程定義 > 環境條目 > 新建
          2. 添加如下的環境變量和值:
          名稱 值
          ALLOC_LIMIT 限定的字節數(比如:600000)
          ALLOC_DEPTH 限定的堆棧深度(比如:10)
          3. 保存設置重新啟動應用服務器

          Unix/Linux平臺上的WAS V4.0 & 4.1:
          1. 添加類似如下的2行在startupServer.sh腳本文件的開頭,這個文件位于<WAS_Home>/bin路徑下:
          export ALLOC_LIMIT=600000
          export ALLOC_DEPTH=10
          2. 重新啟動應用服務器

          Windows平臺上的WAS V4.0 & 4.1:
          1.添加類似如下的2行在adminserver.bat腳本文件的開頭,這個文件位于<WAS_Home>/bin路徑下:
          SET ALLOC_LIMIT=600000
          SET ALLOC_DEPTH=10
          2. 重新啟動應用服務器

          posted on 2008-04-24 17:50 BigOnion 閱讀(346) 評論(0)  編輯  收藏 所屬分類: 性能相關

          主站蜘蛛池模板: 岱山县| 策勒县| 花莲县| 古田县| 德令哈市| 鸡东县| 罗定市| 温州市| 册亨县| 星座| 沂水县| 徐闻县| 余庆县| 云阳县| 花垣县| 明光市| 东台市| 西青区| 昭苏县| 金阳县| 册亨县| 松滋市| 新巴尔虎右旗| 崇阳县| 阜新| 筠连县| 厦门市| 静海县| 辰溪县| 石家庄市| 武冈市| 屏边| 呼和浩特市| 报价| 阿克陶县| 桐柏县| 达孜县| 拉萨市| 威信县| 贵德县| 南和县|