隨筆 - 5, 文章 - 0, 評論 - 0, 引用 - 0
          數據加載中……

          2012年10月23日

          HttpAsyncClient

          HttpAsyncClient 是一個異步的 HTTP 客戶端開發包,基于 HttpCore NIO 和 HttpClient 組件。
          HttpAsyncClient 的出現并不是為了替換 HttpClient,而是作為一個補充用于需要大量并發連接,對性能要求非常高的基于HTTP的原生數據通信,而且提供了事件驅動的 API。

          代碼示例:

                 public Vector<Long> Gets(List<String> urls)
          throws IOReactorException, InterruptedException {
          List<HttpGet> requests = new ArrayList<HttpGet>();
          for (String url : urls) {
          HttpGet get = new HttpGet(url);
          requests.add(get);
          }
          final Vector<Long> dataPackages = new Vector<Long>();
          HttpAsyncClient httpclient = new DefaultHttpAsyncClient();
          httpclient.getParams().setIntParameter("http.socket.timeout", 5000)
          .setIntParameter("http.connection.timeout", 5000)
          .setIntParameter("http.socket.buffer-size", 8192)
          .setBooleanParameter("http.tcp.nodelay", true);
          final CountDownLatch latch = new CountDownLatch(requests.size());
          httpclient.start();
          try {
          for (final HttpGet request : requests) {
          httpclient.execute(request, new FutureCallback<HttpResponse>() {

          @Override
          public void completed(HttpResponse result) {
          String statInfo = "";
          try {
          statInfo = result.getFirstHeader("statInfo").getValue();
          if (statInfo != null) {
          Long size = Long.parseLong(statInfo.split(",")[0].split(":")[1]);
          dataPackages.add(size);
          }
          } catch (Exception e) {
          System.out.println(e);
          System.out.println(statInfo);
          }
          latch.countDown();
          }

          @Override
          public void failed(Exception ex) {
          latch.countDown();
          }

          @Override
          public void cancelled() {
          latch.countDown();
          }
          });
          }
          latch.await();
          } finally {
          httpclient.shutdown();
          }
          return dataPackages;
          }

           


          依賴的pom,
          httpasyncclient已經有4.0-beta3版本了
          <dependency>
              <groupId>org.apache.httpcomponents</groupId>
              <artifactId>httpasyncclient</artifactId>
              <version>4.0-beta1</version>
          </dependency>
          <dependency>
              <groupId>org.apache.httpcomponents</groupId>
              <artifactId>httpclient</artifactId>
              <version>4.2-beta1</version>
          </dependency>


          posted @ 2012-11-26 10:46 莊主游驥 閱讀(628) | 評論 (0)編輯 收藏

          web.xml頁面配置

               摘要: web.xml頁面配置參數詳解         加載順序與它們在 web.xml 文件中的先后順序無關。即不會因為 filter 寫在 listener 的前面而會先加載 filter。最終得出的結論是:listener -> filter -> servlet。  同時還存在著這樣一種配置節...  閱讀全文

          posted @ 2012-11-13 11:37 莊主游驥 閱讀(3204) | 評論 (0)編輯 收藏

          gc 對象晉升old區的一些規則總結

          ygc做步驟為:清空eden+from中所有no ref的對象占用的內存
          將eden+from中的所有存活的對象copy到to中
          在這個過程中一些對象將晉升到old中:
          --to放不下的
          --存活次數超過tenuring threshold的
          重新計算Tenuring Threshold

          然后談談MaxTenuringThreshold這個參數用于控制對象能經歷多少次Minor GC才晉升到舊生代,默認值是15,那是不是意味著對象要經歷15次minor gc才晉升到舊生代呢,來看下面的一個例子。

          public class GCTenuringThreshold{
          public static void main(String[] args) throws Exception{
          GCMemoryObject object1=new GCMemoryObject(2);
          GCMemoryObject object2=new GCMemoryObject(8);
          GCMemoryObject object3=new GCMemoryObject(8);
          GCMemoryObject object4=new GCMemoryObject(8);
          object2=null;
          object3=null;
          GCMemoryObject object5=new GCMemoryObject(8);
          Thread.sleep(4000);
          object2=new GCMemoryObject(8);
          object3=new GCMemoryObject(8);
          object2=null;
          object3=null;
          object5=null;
          GCMemoryObject object6=new GCMemoryObject(8);
          Thread.sleep(5000);
          }
          }
          class GCMemoryObject{
          private byte[] bytes=null;
          public GCMemoryObject(int multi){
          bytes=new byte[1024*256*multi];
          }
          }

          以-Xms20M –Xmx20M –Xmn10M –XX:+UseSerialGC參數執行以上代碼,通過jstat -gcutil [pid] 1000 10的方式查看執行效果,很驚訝執行結果竟然是在第二次minor GC的時候object1就被晉升到old中了,而可以肯定的是這個時候to space空間是充足的,也就是說并不是在to space空間充足的情況下,對象一定要經歷MaxTenuringThreshold次才會晉升到old,那具體規則到底是怎么樣的呢,翻看 Hotspot 6 update 21中SerialGC的實現,可以看到在每次minor GC后,會對這個存活周期的閾值做計算,計算的代碼如下:

          size_t desired_survivor_size = (size_t)((((double) survivor_capacity)*TargetSurvivorRatio)/100);
          size_t total = 0;
          int age = 1;
          assert(sizes[0] == 0, "no objects with age zero should be recorded");
          while (age total += sizes[age];
          // check if including objects of age 'age' made us pass the desired
          // size, if so 'age' is the new threshold
          if (total > desired_survivor_size) break;
          age++;
          }
          int result = age
          其中desired_survivor_size是指survivor space/2,從上面的代碼可看出,在計算存活周期這個閾值時,hotspot會遍歷所有age的table,并對其所占用的大小進行累積,當累積的大 小超過了survivor space的一半時,則以這個age作為新的存活周期閾值,最后取age和MaxTenuringThreshold中更小的一個值。

          按照這樣的規則,上面的運行效果就可驗證了,第一次minor gc的時候存活周期的閾值為MaxTenuringThreshold,minor gc結束后計算出新的閾值為1,在第二次minor gc時object 1的age已經是1了,因此object1被晉升到了舊生代。

          這個規則對于Serial GC以及ParNew GC(但對于開啟了UseAdaptiveSizePolicy的ParNew GC而言也無效,默認是不開啟的)均有效,對于PS(Parallel Scavenge) GC而言,在默認的情況下第一次以InitialTenuringThreshold(默認為7)為準,之后在每次minor GC后均會動態計算,規則比上面的復雜,在設置-XX:-UseAdaptiveSizePolicy后,則以 MaxTenuringThrehsold為準,并且不會重新計算,會是恒定值。

          如希望跟蹤每次minor GC后新的存活周期的閾值,可在啟動參數上增加:-XX:+PrintTenuringDistribution,輸出的信息中的:
          Desired survivor size 1048576 bytes, new threshold 7 (max 15)
          new threshold 7即標識新的存活周期的閾值為7。

          posted @ 2012-10-23 20:52 莊主游驥 閱讀(848) | 評論 (0)編輯 收藏

          主站蜘蛛池模板: 江油市| 铜川市| 民丰县| 株洲市| 葫芦岛市| 从江县| 互助| 甘南县| 宜春市| 府谷县| 大宁县| 涞水县| 科技| 普陀区| 扎兰屯市| 松滋市| 驻马店市| 平顶山市| 临夏市| 兴国县| 榆树市| 黄大仙区| 哈巴河县| 乃东县| 武威市| 新化县| 长海县| 通海县| 万载县| 阿图什市| 资溪县| 泽普县| 呼和浩特市| 教育| 上饶市| 怀集县| 榆林市| 科技| 翁牛特旗| 天台县| 平原县|