Titan專欄

          用文字來整理生命

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            44 隨筆 :: 49 文章 :: 19 評論 :: 0 Trackbacks
          為了提高系統的響應性能,一般都會采用緩存技術來實現,如果用象ehcache、oscache這樣的開源的cache工具來實現,一般都需要由開發人員來設置maxElementsInMemory這個值,但這個值在設置的時候大家都是怎么去設置的呢?憑想像還是隨便寫一個值呢?這個值設的過大嘛有可能會造成outofmemory,設的過小嘛又浪費服務器巨大的內存,為了能夠更好的設置這個值,我寫了個測試程序來估算1M內存能夠緩存多少個對象,代碼如下:
           1public void testSpike(){
           2        print("最大的內存為:"+Runtime.getRuntime().maxMemory()/1024);
           3        print("總的內存為:"+Runtime.getRuntime().totalMemory()/1024);
           4        print("==================================");
           5        long currMemory=Runtime.getRuntime().freeMemory();
           6        print("目前可用的內存為:"+currMemory/1024);
           7        print("==================================");
           8        Map cache=new HashMap();
           9        for (int i = 0; i < 500000; i++{
          10            MockBean bean=new MockBean();
          11            bean.setId(i);
          12            bean.setName("jerry"+i);
          13            bean.setValue(i+"jerry");
          14            cache.put(String.valueOf(i), bean);
          15            long tempMemory=Runtime.getRuntime().freeMemory();
          16            if((currMemory-tempMemory)/1024==1024){
          17                print("此時可用的內存為:"+tempMemory/1024);
          18                print("此時緩存了:"+i+"個對象");
          19                break;
          20            }

          21        }

          22        print("==================================");
          23        cache.clear();
          24        long tempMemory=Runtime.getRuntime().freeMemory();
          25        print("目前可用的內存為:"+tempMemory/1024);
          26        print("消耗的內存為:"+(currMemory-tempMemory)/1024);
          27        print("==================================");
          28        Runtime.getRuntime().gc();
          29        tempMemory=Runtime.getRuntime().freeMemory();
          30        print("目前可用的內存為:"+tempMemory/1024);
          31        print("消耗的內存為:"+(currMemory-tempMemory)/1024);
          32    }

          33    
          34    private void print(String msg){
          35        System.out.println(msg);
          36    }
          在我機器上運行的結果是1M內存可緩存大概4479個對象,同時可以看到,在cache.clear后內存并沒有變化,因為gc是沒那么及時的,這個時候顯式的調用gc則會發現可用的內存量甚至比最初都多,呵呵
          當然,這里只是個簡單的測試,這里測試的也只是緩存一個非常簡單的bean對象,緩存的對象消耗的內存大小還需要根據這個對象中具體的內容而定,比如當緩存的是blob類型的字段的時候,可想而知,這個時候消耗的內存量絕對是不同的。
          這里只是建議大家在對系統性能做優化時最好根據需要緩存的內容做一個估算,設置好應用所需要的jvm的內存值,以便充分利用服務器的硬件資源。
          posted on 2006-01-17 21:18 Titan 閱讀(262) 評論(0)  編輯  收藏 所屬分類: Java技術
          主站蜘蛛池模板: 眉山市| 鄢陵县| 遂宁市| 荣昌县| 平果县| 周宁县| 萝北县| 历史| 沈阳市| 安国市| 恩平市| 扶风县| 凉山| 山阳县| 蓬莱市| 南昌市| 钦州市| 襄垣县| 盐山县| 邯郸市| 略阳县| 柳州市| 宜章县| 万安县| 青海省| 盐池县| 栖霞市| 武川县| 晴隆县| 青浦区| 麟游县| 鹤岗市| 五华县| 西和县| 绍兴县| 永德县| 临泽县| 南宫市| 香河县| 靖安县| 临清市|