为了提高系统的响应性能,一般都会采用缓存技术来实现,如果用象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的内存值,以便充分利用服务器的硬件资源。
来源:疯狂软件教育

转载于:https://blog.51cto.com/cfkjava/843968

Java编程测试1M内存可用来缓存多少对象相关推荐

  1. java 1m_Java编程测试1M内存可用来缓存多少对象

    为了提高系统的响应性能,一般都会采用缓存技术来实现,如果用象ehcache.oscache这样的开源的cache工具来实现,一般都需要由开发人员来设置maxElementsInMemory这个值,但这 ...

  2. java编程测试标识符是否正确_20145209刘一阳《JAVA程序设计》第二周课堂测试

    第二周课堂测试 1.if关键字后面的小括号内,表达式的值可以为10.(B) A .true B .false 2.表达式0xaa | 0x55的值为(C) A .FF B .0 C .255 D .1 ...

  3. Java编程,使用单例模式,新建Rectangle类对象,判断两个长方体是否重叠

    碰到一个面试题,大致意思如标题,如果面试过了别忘了点赞关注. 这个问题给出两个长方形的坐标,问这两个长方形是否有重合部分.画出图来就是这样的: 主要逻辑有人解释过了,我直接上代码 https://bl ...

  4. java编程测试题_Java编程测试可帮助您评估求职者

    java编程测试题 Sometimes back one of my good friend asked me to assess few job candidates for Java progra ...

  5. java内存漏洞_处理Java程序中的内存漏洞

    Java 程序中也有内存漏洞?当然有.与流行的观念相反,在 Java 编程中,内存治理仍然是需要考虑的问题.在本文中,您将了解到什么会导致内存漏洞以及何时应该关注这些漏洞.您还有机会实践一下在您自己的 ...

  6. 《Java性能调优实战》笔记(一)Java编程性能调优、多线程性能优化

    文章目录 一.Java性能调优概述 1.1 性能调优标准 1.2 制定性能调优策略 二.Java编程性能调优 2.1 字符串 2.2 正则表达式 2.3 ArrayList和LinkedList的选择 ...

  7. Java代码优化方案 J2ME内存优化

    从几本书上,N个网站上整理的一些JAVA代码优化方案,最近的项目只有1M内存可用,必须很抠门了~J2ME项目更要注意的 避免内存溢出 l 不用的对象释放(置空) 如 : a不为空时 a=new obj ...

  8. jmap java opts_jmap --查看JVM内存使用详情

    概述 命令jmap是一个多功能的命令.它可以生成 java 程序的 dump 文件, 也可以查看堆内对象示例的统计信息.查看 ClassLoader 的信息以及 finalizer 队列. jmap命 ...

  9. 怎样减少Java编程中bug数量?

    Java编程语言在IT行业毋庸置疑是企业中不可缺少的,现今企业招收大量Java人才,从Web应用到Android应用,这款语言已经被广泛用于开发各类应用及代码中的复杂功能. 不过在编写代码时,bug永 ...

最新文章

  1. 推荐系列:2008年第03期 总5期
  2. 检测IIS应用程序池对象 回收
  3. [python opencv 计算机视觉零基础到实战] 十一找到图片中指定内容
  4. 远控免杀专题(18)-ASWCrypter免杀
  5. 高通LCD的pwm背光驱动
  6. 十四、MySQL函数相关知识总结(简单易懂)
  7. 使用临时表的另外一种方式
  8. unsigned char与char的区别
  9. DG SG childSG fatherSG
  10. 【编程语言】Python-Pandas库中的透视表
  11. Mac IDA debug android exec program
  12. 文件编码 ANSI、GBK、GB2312、MS936、MS932、SJIS、Windows-31 、EUC-JP 、EBCDIC 等等之间的区别与联系
  13. apk提取加密素材_高效IO之Dex加密(三)
  14. 基于SpringBoot的宠物医院管理系统JAVA MYSQL
  15. Unity射线检测实例
  16. 阿里云后台部署全过程-2-Linux环境配置
  17. Stimulsoft Reports如何进行数据连接
  18. opencv学习笔记---如何看懂照片的直方图
  19. 磁盘,分区,文件系统
  20. 【智能优化算法】鸡群算法 (Chicken Swarm Optimization, CSO),2014

热门文章

  1. 交换机tftp服务器修改ip,华为交换机tftp服务器地址
  2. stc15w4k32s4管脚图_STC15W4K32S4系列
  3. mysql template sql_SpringBoot-JdbcTemplates-MySQL
  4. linux进程优雅退出,Golang信号处理及如何实现进程的优雅退出详解
  5. some formulas for bloging
  6. install glm library in ubuntu and use it in qt
  7. 关于DX中纹理平移的一个小问题
  8. 高光谱地物识别练习-从ENVI标准波普库中选择端元进行物质识别
  9. php百度地图定位到街道,百度地图拖动标注输出当前定位坐标及街道信息
  10. 渲染怎么加hdri_关于渲染参数设置,伽马2.2你想要知道的一切!