歲月如哥
          人生非夢
          posts - 50,comments - 144,trackbacks - 0
          首先引用jdk1.5api的doc:
          內存 
          Java 虛擬機的內存系統管理以下類型的內存:
          1. 堆 
          Java 虛擬機具有一個堆,堆是運行時數據區域,所有類實例和數組的內存均從此處分配。堆是在 Java 虛擬機啟動時創建的。對象的堆內存由稱為垃圾回收器 的自動內存管理系統回收。
          堆的大小可以固定,也可以擴大和縮小。堆的內存不需要是連續空間。

          2. 非堆內存
          Java 虛擬機管理堆之外的內存(稱為非堆內存)。 
          Java 虛擬機具有一個由所有線程共享的方法區。方法區屬于非堆內存。它存儲每個類結構,如運行時常數池、字段和方法數據,以及方法和構造方法的代碼。它是在 Java 虛擬機啟動時創建的。 

          方法區在邏輯上屬于堆,但 Java 虛擬機實現可以選擇不對其進行回收或壓縮。與堆類似,方法區的大小可以固定,也可以擴大和縮小。方法區的內存不需要是連續空間。

          除了方法區外,Java 虛擬機實現可能需要用于內部處理或優化的內存,這種內存也是非堆內存。例如,JIT 編譯器需要內存來存儲從 Java 虛擬機代碼轉換而來的本機代碼,從而獲得高性能。

            在網上找到如下的jsp來監視內存使用情況:
           
          <%@ page import="java.lang.management.*" %>
          <%@ page import="java.util.*" %>
          <html>
          <head>
            
          <title>JVM Memory Monitor</title>
          </head>

          <body>
          <table border="0" width="100%">
          <tr><td colspan="2" align="center"><h3>Memory MXBean</h3></td></tr>
          <tr><td
          width="200">Heap Memory Usage</td><td><%=
          ManagementFactory.getMemoryMXBean().getHeapMemoryUsage()
          %></td></tr>
          <tr><td>Non-Heap Memory
          Usage
          </td><td><%=
          ManagementFactory.getMemoryMXBean().getNonHeapMemoryUsage()
          %></td></tr>
          <tr><td colspan="2">&nbsp;</td></tr>
          <tr><td colspan="2" align="center"><h3>Memory Pool MXBeans</h3></td></tr>
          <%
                  Iterator iter 
          = ManagementFactory.getMemoryPoolMXBeans().iterator();
                  
          while (iter.hasNext()) {
                      MemoryPoolMXBean item 
          = (MemoryPoolMXBean) iter.next();
          %>
          <tr><td colspan="2">
          <table border="0" width="100%" style="border: 1px #98AAB1 solid;">
          <tr><td colspan="2" align="center"><b><%= item.getName() %></b></td></tr>
          <tr><td width="200">Type</td><td><%= item.getType() %></td></tr>
          <tr><td>Usage</td><td><%= item.getUsage() %></td></tr>
          <tr><td>Peak Usage</td><td><%= item.getPeakUsage() %></td></tr>
          <tr><td>Collection Usage</td><td><%= item.getCollectionUsage() %></td></tr>
          </table>
          </td></tr>
          <tr><td colspan="2">&nbsp;</td></tr>
          <%%>
          </table>
          </body>
          </html>

          使用的結果(JDK1.5)正如doc描述:
            
          從檢測的結果來看,non-heap memory中,包含了perm gen和一部分jvm自用的內存
          其中heap memory的最大值即我們指定的啟動參數 -Xmx1024m所指定的1024m
          而Perm Gen的最大值即為我們指定的啟動參數 -XX:MaxPermSize=128m 所指定的128m(不指定默認為64m)
          一般的OutOfMemory大部分是因為上面兩個配置參數不夠引起的。
          當然native heap 也可以產生OutOfMemory,如果os的java可用內存全部分給heap了。

          如果發生oom,個人覺得首先是調整參數,比如:-server -Xms1024m -Xmx1024m -XX:PermSize=128m -XX:MaxPermSize=128m
          如果參數調整之后還是oom,則需要考慮優化程序了(當然首先要把死遞歸,死循環排除),最好是用工具監測一下。

          附我們tomcat配置參數修改方案:
           

          ²     Tomcat配置的修改(%tomcat%表示tomcat實際安裝目錄)

          如果tomcat安裝在Solaris環境下,打開 %tomcat%\bin\catalina.sh 文件,在文件的前面加下面紅色字體的內容(注意有雙引號):

              LANG=zh_CN.GB18030
                       
          export LANG
                        
          JAVA_OPTS="-server -Xms1024m -Xmx1024m -XX:PermSize=128m -XX:MaxPermSize=128m"
                        
          export JAVA_OPTS
                        
          JAVA_OPTS="$JAVA_OPTS   -Djava.awt.headless=true"
                         
          echo $JAVA_OPTS   

          如果tomcat安裝在Windows環境下,打開 %tomcat%\bin\catalina.bat 文件,在文件的前面加下面紅色字體的內容(注意沒有雙引號):

          set JAVA_OPTS=-server -Xms1024m -Xmx1024m -XX:PermSize=128m -XX:MaxPermSize=128m

          打開 %tomcat%\conf\server.xml 文件,下面這行:

                maxThreads="150" minSpareThreads="25" maxSpareThreads="75"

          改成:

                maxThreads="250" minSpareThreads="25" maxSpareThreads="100"


          posted on 2008-09-21 20:13 歲月如歌 閱讀(5267) 評論(4)  編輯  收藏 所屬分類: java

          FeedBack:
          # re: 對jvm內存的一些理解
          2008-09-21 21:52 | YYX
          還有stack呢,用-Xss可以調整大小  回復  更多評論
            
          # re: 對jvm內存的一些理解
          2008-09-22 09:20 | #
          對的,還有stack,每個線程都有一個stack,好像是在《java虛擬機規范》第二版的第三章中對jvm內存有比較詳細的解釋說明  回復  更多評論
            
          # re: 對jvm內存的一些理解
          2008-09-22 09:23 | 小趙
          Code Cache是Non-heap memory  回復  更多評論
            
          # re: 對jvm內存的一些理解
          2008-09-22 12:19 | 向左走向右走
          @小趙

          謝謝提醒哈,等有時間了會重新更新一下這個圖片的,會有更詳細的說明
            回復  更多評論
            
          主站蜘蛛池模板: 西乡县| 安陆市| 大田县| 余江县| 轮台县| 长垣县| 彭阳县| 麻江县| 启东市| 通州市| 昌邑市| 大冶市| 得荣县| 万载县| 龙江县| 手游| 紫金县| 拜泉县| 宣威市| 潍坊市| 昌吉市| 郓城县| 宣武区| 乐安县| 清远市| 德令哈市| 华安县| 合水县| 阳新县| 左贡县| 昌江| 沂水县| 黎平县| 马尔康县| 定州市| 大洼县| 香港 | 韶关市| 上饶市| 长泰县| 休宁县|