本帖最后由 李国荧 于 2014-8-17 18:33 编辑
使用软引用构建敏感数据的缓存一
(因为论坛帖子长度的限制,故拆分成2个帖子)
为什么需要使用软引用?
首先,我们看一个雇员信息查询系统的实例。我们将使用一个Java语言实现的雇员信息查询系统查询存储在磁盘文件或者数据库中的雇员人事档案信息。作为一个用户,我们完全有可能需要回头去查看几分钟甚至几秒钟前查看过的雇员档案信息(同样,我们在浏览WEB页面的时候也经常会使用“后退”按钮)。这时我们通常会有两种程序实现方式:一种是把过去查看过的雇员信息保存在内存中,每一个存储了雇员档案信息的Java对象的生命周期贯穿整个应用程序始终;另一种是当用户开始查看其他雇员的档案信息的时候,把存储了当前所查看的雇员档案信息的Java对象结束引用,使得垃圾收集线程可以回收其所占用的内存空间,当用户再次需要浏览该雇员的档案信息的时候,重新构建该雇员的信息。很显然,第一种实现方法将造成大量的内存浪费,而第二种实现的缺陷在于即使垃圾收集线程还没有进行垃圾收集,包含雇员档案信息的对象仍然完好地保存在内存中,应用程序也要重新构建一个对象。我们知道,访问磁盘文件、访问网络资源、查询数据库等操作都是影响应用程序执行性能的重要因素,如果能重新获取那些尚未被回收的Java对象的引用,必将减少不必要的访问,大大提高程序的运行速度。
关于SoftReference的概念、运行机制等内容不再详细介绍。
对于软可及对象,垃圾回收机制仅在内存不足的情况下才会回收其占用的内存空间,换句话说,如果内存空间充足,垃圾回收机制即使运行了,也不会回收软可及对象占用的内存空间。所以如果想在程序中看出SoftReference的效果,就必须使程序在内存不充足的状态下运行。
使用软引用构建敏感数据的缓存二
|
|