`
yesjavame
  • 浏览: 656441 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

大对象缓存的实现与调用原则

阅读更多
在UOP之数据缓存一文中我介绍了对象缓存的一般原则,对其中的大对象缓存只是简单
介绍了基本原理.本文详细地说明如何进行大对象缓存.

基于本栏目的类型,在本栏目中讨论的内容是如何恰当地应用某种技术来进行系统设计.
而不会介绍某种基本技术.如本文涉及的对象的次(软)/弱/虚引用的概念,这是你要自己
参看相关资料而掌握的.


大对象(FatObject)是指在创建时要耗费一定时间,或创建完成后要占用一定的空间的对
象,简单说,就是"来之不易"啊.比如图形对象,Socket连结等.所以这类对象不宜频繁地创
建.应该尽量使用它的缓冲.对象的缓冲不仅仅指缓存对象本身,而且包括多次复用.

但因为这样的对象占用了较大的空间,如果使用频度不高又不能长时间放在内存中,所以在
持久与创建之间产生一个矛盾.既不能每次调都重新创建,又不能一次创建后就永久保持.

算了,这么烦的事,费那么多脑子干什么.交给JVM自己决定好了.
把大对象缓存原则交给JVM自己决定,理由是:

如果JVM发生资源回收,说明现在空间吃紧,那么这类大对象就应该腾出空间了.而平时,JVM
没有发生资源回收,说明还有一定的空间冗余,那就尽量让这样的大对象活得久一些.减少
重复创建的机率.

要达到上面的条件,就是不能有强引用,如果有强引用持有这样的大对象,那么无论如果JVM
大需要回收资源的时候不会回收这个对象.


所以,我们创建一个大对象后,要么就一直不持有这个对象的强引用,要么在强引用后要立即
将对象和引用之间的关联打断.

SoftReferencesr=null;//声明一个用于存返回对象的指示.

if(sr==null||sr.get()==null){
sr=newSoftReference(newFatObject());
}

我们每次都可以从sr.get()获取这个大对象,只要sr.get()为null,说明原来那个对象已经
被回收了,下次调用时就要重新生成.


这样生成的对象,如果我们将它赋给了强引用句柄,如:

Imageimg=(Image)sr.get();
那么在调用img引用完成后,一定要img=null;才能打断引用句柄img与那个大对象的关联.
否则,在JVM进行GC时,它就不能被回收,一直占着资源不能释放.而这样的编程方式又不符合
常归的编程习惯,比竟,JAVA是自动回收内存的,不象C/C++的程序员在使用对象后会记得手工
清除对象,要让JAVA程序员每次使用完对象后都要手动执行handler=null;这样的语句实在
不是一回事.

其实,C#的属性是一个非常好的方式,虽然Class.Attribute象是引用一个类的字段,而实际上
是调用了getXXX方法.在java中我们只好这样来引用缓存的大对象,虽然仍然不是最常规的习
惯,但比每次调用后都要handler=null;这样要自然得多了:

classCacahedFatImage{
SoftReferencesr=null;
StringfilePath;
publicCacahedFatImage(StringfilePath){
this.filePath=filePath;
sr=newSoftReference(newImage(filepath));
}

publicImagegetObject(){
if(sr==null||sr.get()==null)
sr=newSoftReference(newImage(filepath));
return(Image)sr.get();
}

}


在调用的时候,先生成CacahedFatImage对象:

CacahedFatImagecfi=newCacahedFatImage();
以后在调用这个大对象的时候都以cfi.getObject()来代替img引用.

如:cfi.getObject().getWidth();
cfi.getObject().getHeight();


这样,只要这个对象没有被回收我们就可以随时获取到它,而如果JVM需要回收时,因为没强
引用关系,它可以随时被回收.

分享到:
评论

相关推荐

    EchoX3:EchoX3是一个分布式对象缓存,允许将方法添加到这些对象中,以便可以远程调用它们

    EchoX3是一个分布式对象缓存,它允许将方法添加到那些对象中,以便可以远程调用它们。 它基于分布式哈希图,例如可伸缩性,Java nio的出色性能和简单灵活的大容量(多个键)API集。 EchoX3允许在数以千计的数据上...

    【05-面向对象(下)】

    •接口体现了规范与实现分离的原则。充分利用接口可以很好地提高系统的可扩展性和可维护性。 •接口与简单工厂模式、命令模式等。 内部类 •我们把一个类放在另一个类的内部定义,这个定义在其他类...

    亮剑.NET深入体验与实战精要3

    13.4.2 基于面向对象设计实现播放器功能 467 13.4.3 面向对象封装、继承、多态的应用 468 13.4.4 设计模式、条件外置及反射技术的应用 471 13.5 面向对象分析(OOA)的方法 475 13.6 面向对象设计的原则 478 13.6.1 ...

    亮剑.NET深入体验与实战精要2

    13.4.2 基于面向对象设计实现播放器功能 467 13.4.3 面向对象封装、继承、多态的应用 468 13.4.4 设计模式、条件外置及反射技术的应用 471 13.5 面向对象分析(OOA)的方法 475 13.6 面向对象设计的原则 478 13.6.1 ...

    java开源包1

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    开涛高可用高并发-亿级流量核心技术

    11.2.2 维度化缓存与增量缓存 221 11.2.3 大Value缓存 221 11.2.4 热点缓存 221 11.3 分布式缓存与应用负载均衡 222 11.3.1 缓存分布式 222 11.3.2 应用负载均衡 222 11.4 热点数据与更新缓存 223 11.4.1 单机全量...

    ASP.NET3.5从入门到精通

    3.2 面向对象的C#实现 3.2.1 定义 3.2.2 创建一个类和其方法 3.2.3 类成员 3.2.4 构造函数和析构函数 3.3 对象的生命周期 3.3.1 类成员的访问 3.3.2 类的类型 3.3.3 .NET 的垃圾回收机制 3.4 使用命名空间 3.4.1 为...

    php网络开发完全手册

    16.3.2 存储过程的创建与调用 264 16.3.3 存储过程的参数 265 16.3.4 复合语句 267 16.3.5 变量 268 16.3.6 条件语句 269 16.3.7 循环语句 271 16.3.8 游标 273 16.3.9 存储过程的删除 275 16.4 触发器的设计 275 ...

    java开源包3

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    CLR.via.C#.(中文第3版)(自制详细书签)Part1

    21.20 大对象 21.21 监视垃圾回收 第22章 CLR寄宿和AppDomain 22.1 CLR寄宿 22.2 AppDomain 22.2.1 跨越AppDomain边界访问对象 22.3 卸载AppDomain 22.4 监视AppDomain 22.5 AppDomain FirstChance异常通知...

    CLR.via.C#.(中文第3版)(自制详细书签)

    27.8.3 调用EndXxx方法时总是使用相同的对象 27.8.4 为BeginXxx和EndXxx方法使用ref,out和params实参 27.8.5 不能取消异步I/O限制操作 27.8.6 内存消耗 27.8.7 有的I/O操作必须同步完成 27.8.8 FileStream特有...

    java开源包4

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    CLR.via.C#.(中文第3版)(自制详细书签)Part3

    21.20 大对象 21.21 监视垃圾回收 第22章 CLR寄宿和AppDomain 22.1 CLR寄宿 22.2 AppDomain 22.2.1 跨越AppDomain边界访问对象 22.3 卸载AppDomain 22.4 监视AppDomain 22.5 AppDomain FirstChance异常通知...

    CLR.via.C#.(中文第3版)(自制详细书签)Part2

    21.20 大对象 21.21 监视垃圾回收 第22章 CLR寄宿和AppDomain 22.1 CLR寄宿 22.2 AppDomain 22.2.1 跨越AppDomain边界访问对象 22.3 卸载AppDomain 22.4 监视AppDomain 22.5 AppDomain FirstChance异常通知...

    ASP.NET 3.5 开发大全word课件

    这是整部学习资料 由于太大第一章免费供应给大家 在我的上传资源中 如果觉得还不过希望大家给个好评 当然具体本书的作者就不深究了把! 第1章 认识ASP.NET 3.5 1.1 什么是ASP.NET 1.1.1 .NET历史与展望 1.1.2 ASP...

    ASPNET35开发大全第一章

    3.2 面向对象的C#实现 3.2.1 定义 3.2.2 创建一个类和其方法 3.2.3 类成员 3.2.4 构造函数和析构函数 3.3 对象的生命周期 3.3.1 类成员的访问 3.3.2 类的类型 3.3.3 .NET的垃圾回收机制 3.4 使用命名空间 3.4.1 为...

    asp.net知识库

    与DotNet数据对象结合的自定义数据对象设计 (一) 数据对象与DataRow ASP.NET中大结果集的分页[翻译] .net 2.0 访问Oracle --与Sql Server的差异,注意事项,常见异常 Ado.net 与NHibernate的关系? 动态创建数据库...

    ASP.NET 3.5 开发大全11-15

    3.2 面向对象的C#实现 3.2.1 定义 3.2.2 创建一个类和其方法 3.2.3 类成员 3.2.4 构造函数和析构函数 3.3 对象的生命周期 3.3.1 类成员的访问 3.3.2 类的类型 3.3.3 .NET的垃圾回收机制 3.4 使用命名空间 3.4.1 为...

    ASP.NET 3.5 开发大全

    3.2 面向对象的C#实现 3.2.1 定义 3.2.2 创建一个类和其方法 3.2.3 类成员 3.2.4 构造函数和析构函数 3.3 对象的生命周期 3.3.1 类成员的访问 3.3.2 类的类型 3.3.3 .NET的垃圾回收机制 3.4 使用命名空间 3.4.1 为...

    ASP.NET 3.5 开发大全1-5

    3.2 面向对象的C#实现 3.2.1 定义 3.2.2 创建一个类和其方法 3.2.3 类成员 3.2.4 构造函数和析构函数 3.3 对象的生命周期 3.3.1 类成员的访问 3.3.2 类的类型 3.3.3 .NET的垃圾回收机制 3.4 使用命名空间 3.4.1 为...

Global site tag (gtag.js) - Google Analytics