szhswl
宋针还的个人空间

一个测试程序来估算1M内存能够缓存多少个对象,代码如下:

 1 public 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 }
37 


  结果大概是1M内存可缓存大概4479个对象,同时可以看到,在cache.clear后内存并没有变化,因为gc是没那么及时的,这个时候显式的调用gc则会发现可用的内存量甚至比最初都多。

  当然,这里只是个简单的测试,这里测试的也只是缓存一个非常简单的bean对象,缓存的对象消耗的内存大小还需要根据这个对象中具体的内容而定,比如当缓存的是blob类型的字段的时候,可想而知,这个时候消耗的内存量绝对是不同的。

  这里只是建议大家在对系统性能做优化时最好根据需要缓存的内容做一个估算,设置好应用所需要的jvm的内存值,以便充分利用服务器的硬件资源。



---------------------------------------------------------------------------------------------------------------------------------
说人之短,乃护己之短。夸己之长,乃忌人之长。皆由存心不厚,识量太狭耳。能去此弊,可以进德,可以远怨。
http://www.blogjava.net/szhswl
------------------------------------------------------------------------------------------------------ ----------------- ---------
posted on 2007-12-10 21:04 宋针还 阅读(320) 评论(0)  编辑  收藏 所属分类: JAVA

只有注册用户登录后才能发表评论。


网站导航: