Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 348|回复: 0

[Java基础知识]1M内存可用来缓存多少对象?

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-1 18:04:21 | 显示全部楼层 |阅读模式
    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的内存值,以便充分利用服务器的硬件资源。  



      
      
       
       

         
       

         
       
      



      










    源码下载:http://www.hnzz3z.com:8103/zz3zcwb/cwb/dir5/no
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-8 07:27 , Processed in 0.425340 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表