1M內存可用來緩存多少對象?

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

                  }

                  print(
          "==================================");
                  cache.clear();
                  
          long tempMemory=Runtime.getRuntime().freeMemory();
                  print(
          "目前可用的內存為:"+tempMemory/1024);
                  print(
          "消耗的內存為:"+(currMemory-tempMemory)/1024);
                  print(
          "==================================");
                  Runtime.getRuntime().gc();
                  tempMemory
          =Runtime.getRuntime().freeMemory();
                  print(
          "目前可用的內存為:"+tempMemory/1024);
                  print(
          "消耗的內存為:"+(currMemory-tempMemory)/1024);
              }

              
              
          private void print(String msg){
                  System.out.println(msg);
              }

          在我機器上運行的結果是1M內存可緩存大概4479個對象,同時可以看到,在cache.clear后內存并沒有變化,因為gc是沒那么及時的,這個時候顯式的調用gc則會發現可用的內存量甚至比最初都多,呵呵
          當然,這里只是個簡單的測試,這里測試的也只是緩存一個非常簡單的bean對象,緩存的對象消耗的內存大小還需要根據這個對象中具體的內容而定,比如當緩存的是blob類型的字段的時候,可想而知,這個時候消耗的內存量絕對是不同的。
          這里只是建議大家在對系統性能做優化時最好根據需要緩存的內容做一個估算,設置好應用所需要的jvm的內存值,以便充分利用服務器的硬件資源。

          posted on 2006-01-12 23:57 BlueDavy 閱讀(2861) 評論(5)  編輯  收藏 所屬分類: Java

          評論

          # re: 1M內存可用來緩存多少對象? 2006-01-13 10:06 Samuel Cai

          多謝,以前也有想驗證這些問題,卻沒動手。  回復  更多評論   

          # re: 1M內存可用來緩存多少對象? 2006-01-13 12:05 javastr

          請問一個web系統中的所有的數據操作,都是占用的jvm內存,而不是電腦硬件內存嗎??  回復  更多評論   

          # re: 1M內存可用來緩存多少對象? 2006-01-13 20:47 Programmer's Life

          所有的java程序都運行在jvm中,jvm啟動時會有對于硬件內存的一個占有值,比如占有256M、512M等  回復  更多評論   

          # re: 1M內存可用來緩存多少對象? 2006-01-16 00:56 yundy

          你這樣測試沒有意義,每個對象占用的內存都是不一樣的  回復  更多評論   

          # re: 1M內存可用來緩存多少對象? 2006-01-16 18:24 Programmer's Life

          ^_^,本來就只是列舉一個方法而已...  回復  更多評論   

          公告

           









          feedsky
          抓蝦
          google reader
          鮮果

          導航

          <2006年1月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          統計

          隨筆分類

          隨筆檔案

          文章檔案

          Blogger's

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 尼玛县| 麻江县| 承德市| 宜川县| 阿拉善右旗| 惠水县| 扎赉特旗| 绥德县| 新民市| 福安市| 专栏| 连州市| 吐鲁番市| 阿拉尔市| 中牟县| 东至县| 大名县| 长海县| 离岛区| 茂名市| 巴彦县| 大港区| 河池市| 绩溪县| 库尔勒市| 盐亭县| 白城市| 若羌县| 菏泽市| 买车| 灌云县| 旬阳县| 乐平市| 沾益县| 五常市| 鞍山市| 灵璧县| 平原县| 滨州市| 准格尔旗| 铜鼓县|