paulwong

          用ab命令來對 JVM進行內存分析的一個例子

          1、JVM的啟動參數
          我是這樣設置的:
            java -Xmx1024m -Xms1024m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxPermSize=16m

          啟動tomcat之后,使用 jmap -heap `pgrep -u root java`,得到如下信息:

          Heap Configuration:
             MinHeapFreeRatio = 40
             MaxHeapFreeRatio = 70
             MaxHeapSize      = 1073741824 (1024.0MB)
             NewSize          = 1048576 (1.0MB)
             MaxNewSize       = 4294901760 (4095.9375MB)
             OldSize          = 4194304 (4.0MB)
             NewRatio         = 4
             SurvivorRatio    = 4
             PermSize         = 12582912 (12.0MB)
             MaxPermSize      = 16777216 (16.0MB)
          Heap Usage:
          New Generation (Eden + 1 Survivor Space):
             capacity = 178913280 (170.625MB)
             used     = 51533904 (49.14656066894531MB)
             free     = 127379376 (121.47843933105469MB)
             28.80384508070055% used
          Eden Space:
             capacity = 143130624 (136.5MB)
             used     = 51533904 (49.14656066894531MB)
             free     = 91596720 (87.35343933105469MB)
             36.00480635087569% used
          From Space:
             capacity = 35782656 (34.125MB)
             used     = 0 (0.0MB)
             free     = 35782656 (34.125MB)
             0.0% used
          To Space:
             capacity = 35782656 (34.125MB)
             used     = 0 (0.0MB)
             free     = 35782656 (34.125MB)
             0.0% used
          tenured generation:
             capacity = 859045888 (819.25MB)
             used     = 1952984 (1.8625106811523438MB)
             free     = 857092904 (817.3874893188477MB)
             0.22734338494383202% used
          Perm Generation:
             capacity = 12582912 (12.0MB)
             used     = 6656024 (6.347679138183594MB)
             free     = 5926888 (5.652320861816406MB)
             52.897326151529946% used

          ------------------------------------------華麗的分割線---------------------------------------

          按照這個參數來計算的話(可以參考這里:http://blog.sina.com.cn/s/blog_68158ebf0100wp83.html
          -Xmx1024m -Xms1024m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxPermSize=16m
          -Xmx1024m 最大堆內存為 1024M
          -Xms1024m 初始堆內存為 1024M
          -XX:NewRatio=4 

          則 年輕代:年老代=1:4  1024M/5=204.8M
          故 年輕代=204.8M  年老代=819.2M
          -XX:SurvivorRatio=4
          則年輕代中 2Survivor:1Eden=2:4 204.8M/6=34.13333333333333M
          故 Eden=136.5333333333333M  1Suivivor=34.13333333333333M
          用 jmap -heap <pid>
          查看的結果 與我們計算的結果一致

          -----------------------------------華麗的分割線-------------------------------------------

          3、編寫測試頁面
              在網站根目錄里新建頁面perf.jsp,內容如下:
          <%intsize = (int)(1024 * 1024 * m);byte[] buffer = new byte[size];Thread.sleep(s);%>
          注:m值用來設置每次申請內存的大小,s 表示睡眠多少ms

          4、使用jstat來監控內存變化
          ·jstat命令的用法和介紹,參考這里http://blog.sina.com.cn/s/blog_68158ebf0100woyh.html
          這里使用 jstat -gcutil `pgrep -u root java` 1500 10 
             再解釋一下,這里有三個參數:
          ·pgrep -u root java --> 得到java的進程ID號
          ·1500 --> 表示每隔1500ms取一次數據
          ·10 --> 表示一共取10次數據

          5、用ab來進行壓測
          壓測的命令:[root@CentOS ~]# ab -c150 -n50000 "http://localhost/perf.jsp?m=1&s=10"
          注:這里使用150個線程并發訪問,一共訪問50000次。
              另外我做了apache與tomcat的整合,過程見:http://blog.sina.com.cn/s/blog_68158ebf0100wnvx.html
          默認情況下你可以使用 http://localhost:8080/perf.jsp?m=1&s=10 來訪問。

          --------------------------------------------華麗的分割線----------------------------------------

          下面開始進行實驗:
          ·先啟動Java內存的監聽:
              [root@CentOS ~]# jstat -gcutil 8570 1500 10 
          ·在開啟一個終端,開始壓測:
              [root@CentOS ~]# ab -c150 -n50000 "http://localhost/perf.jsp?m=1&s=10"
          兩個命令結束之后的結果如下:

          jstat:
          [root@CentOS ~]# jstat -gcutil 8570 1500 10 
            S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT   
            0.06   0.00  53.15   2.03  67.18     52    0.830     1    0.218    1.048
            0.00   0.04  18.46   2.03  67.18     55    0.833     1    0.218    1.052
            0.03   0.00  28.94   2.03  67.18     56    0.835     1    0.218    1.053
            0.00   0.04  34.02   2.03  67.18     57    0.836     1    0.218    1.054
            0.04   0.00  34.13   2.03  67.18     58    0.837     1    0.218    1.055
            0.00   0.04  38.62   2.03  67.18     59    0.838     1    0.218    1.056
            0.04   0.00   8.39   2.03  67.18     60    0.839     1    0.218    1.058
            0.04   0.00   8.39   2.03  67.18     60    0.839     1    0.218    1.058
            0.04   0.00   8.39   2.03  67.18     60    0.839     1    0.218    1.058
            0.04   0.00   8.39   2.03  67.18     60    0.839     1    0.218    1.058

          結果簡單解析:
              可以看到JVM里S0和S1始終有一個是空的,Eden區達到一定比例之后就會產生Minor GC,由于我這里的Old Generation 區設置的比較大,所以沒有產生Full GC。

          ab
          [root@CentOS ~]# ab -c150 -n50000 "http://localhost/perf.jsp?m=1&s=10"
          This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
          Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
          Copyright 2006 The Apache Software Foundation, http://www.apache.org/
          Benchmarking localhost (be patient)
          Completed 5000 requests
          Completed 10000 requests
          Completed 15000 requests
          Completed 20000 requests
          Completed 25000 requests
          Completed 30000 requests
          Completed 35000 requests
          Completed 40000 requests
          Completed 45000 requests
          Finished 50000 requests
          Server Software:        Apache/2.2.3
          Server Hostname:        localhost
          Server Port:            80
          Document Path:          /perf.jsp?m=1&s=10
          Document Length:        979 bytes
          Concurrency Level:      150
          Time taken for tests:   13.467648 seconds
          Complete requests:      50000
          Failed requests:        0
          Write errors:           0
          Non-2xx responses:      50005
          Total transferred:      57605760 bytes
          HTML transferred:       48954895 bytes
          Requests per second:    3712.60 [#/sec] (mean)
          Time per request:       40.403 [ms] (mean)   #平均請求時間
          Time per request:       0.269 [ms] (mean, across all concurrent requests) 
          Transfer rate:          4177.05 [Kbytes/sec] received
          Connection Times (ms)
                        min  mean[+/-sd] median   max
          Connect:        0    1  46.5      0    3701
          Processing:    10   38  70.3     36    6885
          Waiting:        3   35  70.3     33    6883
          Total:         10   39  84.4     37    6901
          Percentage of the requests served within a certain time (ms)
            50%     37
            66%     38
            75%     39
            80%     39
            90%     41
            95%     43
            98%     50
            99%     58
           100%   6901 (longest request)

          詳細的分析見:http://blog.sina.com.cn/s/blog_68158ebf0100woyp.html

          posted on 2012-09-26 22:46 paulwong 閱讀(561) 評論(0)  編輯  收藏 所屬分類: 性能優化

          主站蜘蛛池模板: 平泉县| 临漳县| 东乡县| 无棣县| 新和县| 苏尼特右旗| 涞水县| 余庆县| 江城| 乐昌市| 盐津县| 蒙自县| 中西区| 肥乡县| 奎屯市| 黄平县| 兴安县| 屏南县| 霞浦县| 福海县| 黔江区| 岳阳市| 诸暨市| 措勤县| 大理市| 杨浦区| 晋中市| 绿春县| 交口县| 平原县| 孙吴县| 益阳市| 宁明县| 屯门区| 唐河县| 天水市| 罗田县| 潮州市| 东莞市| 祁东县| 英山县|