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 阅读(2853) 评论(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

搜索

最新评论

阅读排行榜

评论排行榜