返回列表 发帖

[突破基本功16课] 《程序员基本功16课》中的"软引用"学习疑问

在《突破程序员基本功的16课》
第106面
讲到了“软引用”的用法
其好处是
  1. “当heap不足时,系统也可以回收软引用引用的对象,从而提高程序运行性能,避免垃圾回收”
复制代码
象我项目中有如下代码
  1. ........
  2. List<Object[]>  objList=getObjectList(sql);
  3. List<ReceiptBean> list=new ArrayList<ReceiptBean>();
  4. for(Object[] obj:objList)
  5. {
  6.      //原来我的写法,是下面的强引用
  7.     // ReceiptBean rb=new ReceiptBean();

  8.     //现在学习了该书上讲的"软引用"后,我变成了如下的写法
  9. SofeReference<ReceiptBean > sr=new SoftReference<ReceiptBean >(new ReceiptBean());
  10.      ...
  11.      sr.get().setName((String)obj[0]);
  12.      sr.get().setSex((String)obj[1]);
  13.      ....

  14.     list.add(sr.get());
  15.   //通知系统进行垃圾回收
  16.   System.gc();
  17.   System.runFinalization();
  18. }
复制代码
我在上面代码中获得的List,其中封装的都是ReceiptBean类对象,假设上面List获得封装有10000个,也就是上面,要开辟10000个“软引用”,一旦获得10000个“软引用”封装到List,最后再封装到request或session中,输出到jsp页面中。。

如果此时,heap内存不足时,如果一旦回收了其中的某些“软引用”,那不是List中封装的ReceiptBean类对象就变成了null对象,在jsp页面,显示不了啊。。。

希望站长,能对此为读者解惑一下,先谢谢了!

[ 本帖最后由 crazyit 于 2010-5-22 16:11 编辑 ]

提问赏金:5金币
获奖名单 : kongyeeku(5金币)    
成功的人不是赢在起点,而是赢在转折点!

是的。
软引用所引用的对象可能会被垃圾回收器所回收,因此如果你要传递到JSP页面中的对象不应该使用软引用。
那到底在何时使用呢?
你想想——就像你家有100张椅子,你确定2天之后一定要用到这100张椅子(比如你是开餐馆的,2天之后你就要宴请100个人),那你不应该是用这种可能导致椅子被“扔掉”的机制。

如果你家只是一个椅子租赁机构,你除了租赁椅子,还要租赁其他的东西,你可以把内存想象成你家的仓库,当你的其他东西越来越多、仓库不够用时,软引用机制可以保证仓库自动"扔掉"部分暂时不使用的椅子。
——那么如果下次有100个人再来租椅子怎么办呢?可能你的软引用所引用的椅子都被没了,所以你应该在把椅子租赁出去之前,先去判断椅子是否还存在。

想到这是什么场景了吗?这是典型的池。所以一般在这种场景下可以考虑使用软引用、弱引用。
——在TopLink中有几个配置参数都涉及软引用、弱引用的知识。
生命没有假期!
如果生命只剩下最后一秒,你可会想到我?

TOP

哈,谢谢站长了。。经过站长上面形象的比如,我基本明白了。 。我再来好好体会一下吧..
成功的人不是赢在起点,而是赢在转折点!

TOP

返回列表