4.7 缓存容量的相关属性设置

通过上面的缓存实例,我们了解了如何读写缓存,那么如果不停地往缓存里写入数据,会发生什么情况呢?在config.xml的Park部分有个SAFEMEMORYPER配置项:

默认配置为0.95,代表内存占用安全比率在95%左右,如果超出该比率,将无法正确写入,会返回null,并且系统会提示写入错误,但是不会抛出系统异常。这个安全占用比率的设置是为了避免发生OutOfMemory造成系统崩溃。但是我们要认识到,由于JVM的自动回收和释放内存等其他因素影响,这个比率不一定能非常精确地反映真实内存占用比例,它只反映了某个时间点的大致占用状况。我们可以写个DEMO看看效果。

SetValue是一个main函数类,它获取到ParkLocal后,不停地写入domain和node以及对应的value值,为了方便演示,domain/node/value都为序号数字,如果写入成功,会返回结果对象,否则返回null。我们将其输出显示出来。

另外,为了尽快看到效果,我们将SAFEMEMORYPER调整得小一些:

  1. <SAFEMEMORYPER>0.40</SAFEMEMORYPER>

运行步骤如下:

1)启动ParkServerDemo(它的IP端口已经在配置文件指定),结果如图4-17所示:

  1. java -cp fourinone.jar; ParkServerDemo

4.7 缓存容量的相关属性设置 - 图1

图4-17 ParkServerDemo

2)启动SetValue,结果如图4-18所示。

  1. java -cp fourinone.jar; SetValue

4.7 缓存容量的相关属性设置 - 图2

图4-18 SetValue

我们运行了一会儿后可以看到,界面输出“The capacity close to out of memory,please clear out some data!”这意味着内存已经接近安全比率,不再允许写入数据,请及时清空缓存的数据,减少占用。这个时候写入数据不成功,返回null值。

DEMO源码如下:

  1. // ParkServerDemo
  2. import com.fourinone.BeanContext;
  3. public class ParkServerDemo
  4. {
  5. public static void main(String[] args)
  6. {
  7. BeanContext.startPark();
  8. }
  9. }
  10.  
  11.  
  12. // SetValue
  13. import com.fourinone.BeanContext;
  14. import com.fourinone.ParkLocal;
  15. import com.fourinone.ObjectBean;
  16.  
  17. public class SetValue
  18. {
  19. public static void main(String[] args)
  20. {
  21. ParkLocal pl = BeanContext.getPark();
  22. int i=0;
  23. while(true){
  24. ObjectBean ob = pl.create(i+"", i+"", i+"");
  25. System.out.println("No."+i);
  26. System.out.println(ob);
  27. i=i+1;
  28. }
  29. }
  30. }