Titan專欄

          用文字來整理生命

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            44 隨筆 :: 49 文章 :: 19 評論 :: 0 Trackbacks
          為了提高系統(tǒng)的響應性能,一般都會采用緩存技術來實現(xiàn),如果用象ehcache、oscache這樣的開源的cache工具來實現(xiàn),一般都需要由開發(fā)人員來設置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則會發(fā)現(xiàn)可用的內存量甚至比最初都多,呵呵
          當然,這里只是個簡單的測試,這里測試的也只是緩存一個非常簡單的bean對象,緩存的對象消耗的內存大小還需要根據這個對象中具體的內容而定,比如當緩存的是blob類型的字段的時候,可想而知,這個時候消耗的內存量絕對是不同的。
          這里只是建議大家在對系統(tǒng)性能做優(yōu)化時最好根據需要緩存的內容做一個估算,設置好應用所需要的jvm的內存值,以便充分利用服務器的硬件資源。
          posted on 2006-01-17 21:18 Titan 閱讀(265) 評論(0)  編輯  收藏 所屬分類: Java技術
          主站蜘蛛池模板: 夹江县| 溆浦县| 台北县| 湘阴县| 贵南县| 广灵县| 泾源县| 南康市| 宣城市| 东源县| 营口市| 昭平县| 滦南县| 永州市| 颍上县| 长沙市| 水富县| 德钦县| 乐东| 吉林省| 青田县| 余干县| 望江县| 静安区| 莱西市| 西乌| 锦屏县| 遂宁市| 修文县| 太康县| 山阴县| 河西区| 锦屏县| 华安县| 临夏市| 临湘市| 三江| 柯坪县| 邹城市| 张掖市| 翁源县|