1M內(nèi)存可用來緩存多少對象?

          為了提高系統(tǒng)的響應(yīng)性能,一般都會采用緩存技術(shù)來實(shí)現(xiàn),如果用象ehcache、oscache這樣的開源的cache工具來實(shí)現(xiàn),一般都需要由開發(fā)人員來設(shè)置maxElementsInMemory這個值,但這個值在設(shè)置的時候大家都是怎么去設(shè)置的呢?憑想像還是隨便寫一個值呢?這個值設(shè)的過大嘛有可能會造成outofmemory,設(shè)的過小嘛又浪費(fèi)服務(wù)器巨大的內(nèi)存,為了能夠更好的設(shè)置這個值,我寫了個測試程序來估算1M內(nèi)存能夠緩存多少個對象,代碼如下:
          public void testSpike(){
                  print(
          "最大的內(nèi)存為:"+Runtime.getRuntime().maxMemory()/1024);
                  print(
          "總的內(nèi)存為:"+Runtime.getRuntime().totalMemory()/1024);
                  print(
          "==================================");
                  
          long currMemory=Runtime.getRuntime().freeMemory();
                  print(
          "目前可用的內(nèi)存為:"+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(
          "此時可用的內(nèi)存為:"+tempMemory/1024);
                          print(
          "此時緩存了:"+i+"個對象");
                          
          break;
                      }

                  }

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

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

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

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

          評論

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

          多謝,以前也有想驗(yàn)證這些問題,卻沒動手。  回復(fù)  更多評論   

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

          請問一個web系統(tǒng)中的所有的數(shù)據(jù)操作,都是占用的jvm內(nèi)存,而不是電腦硬件內(nèi)存嗎??  回復(fù)  更多評論   

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

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

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

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

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

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

          公告

           









          feedsky
          抓蝦
          google reader
          鮮果

          導(dǎo)航

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

          統(tǒng)計

          隨筆分類

          隨筆檔案

          文章檔案

          Blogger's

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 祁阳县| 吉木萨尔县| 绍兴县| 琼海市| 清远市| 邯郸县| 华蓥市| 肥西县| 涪陵区| 平凉市| 南投县| 垣曲县| 阿荣旗| 昌图县| 奎屯市| 毕节市| 商水县| 林甸县| 房山区| 墨玉县| 汨罗市| 牡丹江市| 兴城市| 博白县| 正镶白旗| 墨玉县| 珲春市| 桃园县| 揭东县| 襄汾县| 漳平市| 昭通市| 科技| 仙游县| 新田县| 古蔺县| 丹凤县| 左权县| 青冈县| 明水县| 东辽县|