4.7 缓存容量的相关属性设置
通过上面的缓存实例,我们了解了如何读写缓存,那么如果不停地往缓存里写入数据,会发生什么情况呢?在config.xml的Park部分有个SAFEMEMORYPER配置项:
默认配置为0.95,代表内存占用安全比率在95%左右,如果超出该比率,将无法正确写入,会返回null,并且系统会提示写入错误,但是不会抛出系统异常。这个安全占用比率的设置是为了避免发生OutOfMemory造成系统崩溃。但是我们要认识到,由于JVM的自动回收和释放内存等其他因素影响,这个比率不一定能非常精确地反映真实内存占用比例,它只反映了某个时间点的大致占用状况。我们可以写个DEMO看看效果。
SetValue是一个main函数类,它获取到ParkLocal后,不停地写入domain和node以及对应的value值,为了方便演示,domain/node/value都为序号数字,如果写入成功,会返回结果对象,否则返回null。我们将其输出显示出来。
另外,为了尽快看到效果,我们将SAFEMEMORYPER调整得小一些:
- <SAFEMEMORYPER>0.40</SAFEMEMORYPER>
运行步骤如下:
1)启动ParkServerDemo(它的IP端口已经在配置文件指定),结果如图4-17所示:
- java -cp fourinone.jar; ParkServerDemo
图4-17 ParkServerDemo
2)启动SetValue,结果如图4-18所示。
- java -cp fourinone.jar; SetValue
图4-18 SetValue
我们运行了一会儿后可以看到,界面输出“The capacity close to out of memory,please clear out some data!”这意味着内存已经接近安全比率,不再允许写入数据,请及时清空缓存的数据,减少占用。这个时候写入数据不成功,返回null值。
DEMO源码如下:
- // ParkServerDemo
- import com.fourinone.BeanContext;
- public class ParkServerDemo
- {
- public static void main(String[] args)
- {
- BeanContext.startPark();
- }
- }
- // SetValue
- import com.fourinone.BeanContext;
- import com.fourinone.ParkLocal;
- import com.fourinone.ObjectBean;
- public class SetValue
- {
- public static void main(String[] args)
- {
- ParkLocal pl = BeanContext.getPark();
- int i=0;
- while(true){
- ObjectBean ob = pl.create(i+"", i+"", i+"");
- System.out.println("No."+i);
- System.out.println(ob);
- i=i+1;
- }
- }
- }